BlackJack hat geschrieben:@bords0: Au weia, dass ist ja jetzt etwas *tootaaal* anderes.
Code: Alles auswählen
def abc(liste, n=12):
length = len(liste) - 1
for i in xrange(n**length):
for j in reversed(xrange(length)):
i, k = divmod(i, n)
liste[j] = k + 1
Und ich weigere mich `main()` am Ende "aufzurufen", weil ich befürchte, dass das als "Sprung" missbraucht wird, und das wäre total daneben. Das wäre nicht einmal mehr eine Stilfrage, sondern ein Speicherleck und damit schlicht ein Programmierfehler.
Ausserdem bin ich mir gar nicht so sicher, dass das letzte Element der Liste erhalten bleiben sollte, oder ob das nicht einfach nur ein Fehler in dem gezeigten Beispiel war. Denn für echten Quelltext ist das ein bisschen zu sinnlos.
Für main() (schlechter Name) stelle ich mir so etwas vor wie
Das Hauptprogramm kann ja nicht in main stehen, denn main wird ja für jede Belegung von liste aufgerufen werden (nicht "am Ende"). Der übliche Fehler, auf den du wohl anspielst, wäre aber, am Ende der Funktion das Hauptprogramm aufzurufen und nie wieder zurückzukehren. Dann hätte Monty Python aber gerade kein Problem mit dem Wiederheruntersetzen von zaehler gehabt.
Irgendwas wird man am Ende deiner äußeren Schleife noch aufrufen wollen (bei Monty Python: main()), sonst könnte man es ja gleich so schreiben:
Code: Alles auswählen
def abc(liste, n=12):
liste[:-1] = [n] * (len(liste) - 1)
Die Funktionalität des Originals, die ersten zaehler Positionen von liste unverändert zu lassen, fehlt noch bei deiner Version. Klar kannst du das noch einbauen - darum geht es nicht.
Ich will nur zum Ausdruck bringen, dass es in diesem Beispiel keineswegs trivial ist, die Funktionalität exakt iterativ nachzubauen. Eigentlich bin ich sogar der Meinung, dass Rekursion hier ziemlich sinnvoll ist. Die Rekursive Version ist lesbarer und bietet mehr Funktionalität. (Vermutlich ist sie auch schneller - aber möglicherweise könnte man eine iterative Version schreiben, die noch schneller ist.)