Ich hab meine Variante noch mal etwas Ressourcen-schonender geschrieben:
Code: Alles auswählen
>>> def variation(n, code_set, curr_list=['']):
if n == 0:
for c in curr_list:
yield c
else:
for term in variation(n - 1, code_set, curr_list):
for c in code_set:
yield c + term
>>> a = variation(2, 'ABC')
>>> b = variation(1, 'ABC', a)
>>> for i in b: print i
Im Prinzip entspricht dies aber Joghurts Variante, der mir damit zuvorkam. Der Vorteil bei meiner Variante ist aber, dass man erst Variationen der Länge n überprüfen kann, und dann dieses Zwischenergebnis zur eventuell notwendigen Überprüfung der Variationen mit Länge n+1 verwenden kann. (Hier im Beispiel mit Länge 2 und 3 demonstriert.)
MfG
HWK
Edit: Ist natürlich Blödsinn!
Wenn man die Zwischenergebnisse ohne Neuberechnung weiterverwenden will, muss man sie auch zwischenspeichern, z.B. als Liste. Ansonsten werden sie immer wieder aufs Neue durch die Generatoren berechnet. Insofern könnte man dann auch gleich meine alte Version, die mit Listen arbeitet, verwenden. Man muss somit selbst entscheiden, was man verwenden will. Wenn man die Länge des Codes Schritt für Schritt erhöht, sind wohl die Listen sinnvoller; wenn man die Länge des Codes kennt, sparen die Generatoren viel Ressourcen.