Seite 1 von 1

WörterGen

Verfasst: Mittwoch 22. Juni 2011, 09:22
von Newcomer
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

Re: WörterGen

Verfasst: Mittwoch 22. Juni 2011, 09:31
von EyDu
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.

Re: WörterGen

Verfasst: Mittwoch 22. Juni 2011, 09:33
von HerrHagen

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',
...

Re: WörterGen

Verfasst: Mittwoch 22. Juni 2011, 09:37
von 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.

Re: WörterGen

Verfasst: Mittwoch 22. Juni 2011, 09:40
von /me
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.

Re: WörterGen

Verfasst: Mittwoch 22. Juni 2011, 10:22
von Barabbas
/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 :)

Re: WörterGen

Verfasst: Mittwoch 22. Juni 2011, 10:35
von Newcomer
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 :| :|

Re: WörterGen

Verfasst: Mittwoch 22. Juni 2011, 10:47
von EyDu
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.

Re: WörterGen

Verfasst: Mittwoch 22. Juni 2011, 13:13
von 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));
			}
		}
	}
}