WörterGen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Newcomer
User
Beiträge: 131
Registriert: Sonntag 15. Mai 2011, 20:41

Hi

Ich hab hier nen WörterGen, der mir alle Wörter von aaa bis zzz ausgibt. Nun möchte ich, dass man nur eine bestimmte Zahl eingibt, die die Länge der Wortkombinationen beschreibt und dann das Programm die Buchstabenkombinationen dazu ausgibt. Ich hab es Rekursiv versucht, bin aber gescheitert, jetzt meine Frage, wird sowas auch Iterativ funktionieren??? Und wenn ja wie
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Du kannst jeden rekursiven Ansatz auch iterativ - und umgekehrt - formulieren. Hier bietet sich eine rekursive Lösung geradezu an. Zeig mal, was du bereits für Code hast, den kann man sicher korrigieren. Wenn du nur eine einfache Lösung brauchst, dann gibt es natürlich nocht das itertools-Modul.
Das Leben ist wie ein Tennisball.
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

Code: Alles auswählen

>>> import itertools
>>> import string
>>> map("".join, itertools.product(string.ascii_uppercase, repeat=3))
['AAA',
 'AAB',
 'AAC',
 'AAD',
 'AAE',
 'AAF',
 'AAG',
 'AAH',
 'AAI',
...
BlackJack

@Newcomer: Klar geht das auch iterativ. Du kannst Deine Wörter doch einfach als Zahlen zur Basis 26 auffassen mit 'a' bis 'z' als den Ziffern die zur Anzeige verwendet werden. Da könntest Du entweder eine Funktion schreiben die eine beliebige Zahl in diese Darstellung überführt und links mit 0en, also bei dem Ziffernsatz mit 'a's auffüllt, oder Du schreibst eine Funktion die jeweils 1 (also 'b') zu einer Zahl zur Basis 26 addiert, die als Liste von Ziffernwerten repräsentiert wird.
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

HerrHagen hat geschrieben:

Code: Alles auswählen

>>> import itertools
>>> import string
>>> map("".join, itertools.product(string.ascii_uppercase, repeat=3))
Man könnte auch noch imap statt map verwenden.
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

/me hat geschrieben:
HerrHagen hat geschrieben:

Code: Alles auswählen

>>> import itertools
>>> import string
>>> map("".join, itertools.product(string.ascii_uppercase, repeat=3))
Man könnte auch noch imap statt map verwenden.
Nicht in Python3 :)
Newcomer
User
Beiträge: 131
Registriert: Sonntag 15. Mai 2011, 20:41

Hi also danke für eure Antworten, ich hab das jetzt erst so:

Code: Alles auswählen

def gen (int):
    values="abcdefghijklmnopqrstuvxyz"
    for i in values:
        for z in values:
            for k in values:
                yield i+z+k



a=gen("hi")
for z in a:
    print(z)
Dann dacht ich mir, dass man das vll. so machen kann:

Code: Alles auswählen

[...]
for i in gen(int)
[...]
Das Problem ist einfach, dass ich nie rekrusiv zu programmieren gelernt habe, und ich mir alles selber erarbeiten musste. Wie würde der Rekrusive Anstatz dafür aussehen???
Iterativ bekomm ich, glaub ich selber hin :roll: :K :| :|
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Wie schon oben gesagt: zeige doch mal deinen rekursiven Ansatz und beschreibe was du als Ergebnis erhältst und was du erwartest. Vielleicht solltest du dich erstmal an einem etwas leichteren Beispiel für rekursive Berechnungen ausprobieren. Die Fibonacci-Zahlen sind recht anschaulich und einfach umzusetzen.
Das Leben ist wie ein Tennisball.
BlackJack

Iterativ eine Zahl in eine entsprechende Zeichenkette umwandeln (in C#):

Code: Alles auswählen

using System;
using System.Text;

namespace PythonForum
{
	class MainClass
	{
		private const int DigitCount = 26;
		private const char ZeroDigit = 'a';

		public static string int2string (int n, int length)
		{
			char[] result =  new String(ZeroDigit, length).ToCharArray ();
			int i = length - 1;
			int remainder;
			
			if (n < 0) {
				throw new ArgumentOutOfRangeException ("n", "must be positive");
			}
			if (length < 1) {
				throw new ArgumentOutOfRangeException("length", "must be at least 1");
			}
			
			while (n != 0 && i >= 0) {
				n = Math.DivRem (n, DigitCount, out remainder);
				result[i--] = Convert.ToChar (remainder + Convert.ToInt32 (ZeroDigit));
			}
			
			if (n != 0 && i < 0) {
				throw new OverflowException (String.Format ("Value too large for {0} digit(s)", length));
			}
			
			return new String (result);
		}

		public static void Main (string[] args)
		{
			int n = 3;
			
			for (int i = 0; i < Math.Pow (DigitCount, n); i++) {
				Console.WriteLine (int2string (i, n));
			}
		}
	}
}
Antworten