Ich versuche eine rekursive Funktion zu schreiben, die von 0
nach n
druckt, aber ich habe keine Ahnung, wie es geht. Ich habe versehentlich einen erstellt, der von n
bis 0
though:
Ich weiß nicht, ob das hilft oder nicht, vielleicht kann ich etwas im Code ändern, damit es von 0
nach n
geht?
Du hast es fast verstanden! Hier ist eine feste, vereinfachte Version:
%Vor%Beachten Sie Folgendes:
print
-Anweisung nach dem rekursiven Aufruf > platziert werden
n < 0
, da wir nur drucken, bleibt nichts mehr übrig und es ist ok, None
(Pythons Standard-Rückgabewert) AKTUALISIEREN
Es scheint, dass das Schreiben einer tail-rekursiven Lösung hier der letzte Schrei ist :) naja, hier ist meine Aufnahme, eine vereinfachte und tail-rekursive Version von @ AndyHaydens Idee - mit dem Tail Call Optimization Decorator recipe :
%Vor%Wie auch immer, es funktioniert wie erwartet:
%Vor%Du bist ungefähr 99% da.
Denken Sie an Ihren Basisfall und Ihren rekursiven Schritt - wenn Sie 0 drücken, was möchten Sie tun? Wenn du dich noch immer von n
weg arbeitest, was willst du dann?
Wenn Sie die Reihenfolge, in der Sie den Wert drucken, umkehren, erreichen Sie das gewünschte Ergebnis.
%Vor% Der Grund dafür ist, dass rekursive Aufrufe auf dem Aufruf-Stack ausgeführt werden. Wenn Sie Anrufe auf den Stapel schieben, während Ihr Endfall nicht erreicht wird, fügen Sie weitere Anrufe hinzu, bis Sie den Basisfall n == 0
erreichen. Dann beginnen Sie ausschließlich mit dem Drucken der Werte.
Die anderen Aufrufe werden dann durch die print-Anweisung durchlaufen, da ihre Ausführung in die Zeile nach der Bedingung zurückgekehrt ist.
Der Aufruf-Stack sieht also ungefähr so aus:
%Vor%Sie können die 0 und das n und das + durch ein - ersetzen, um Ihre rekursive Countdown-Funktion zu einem rekursiven Countup zu machen:
%Vor%Und nenne es wie folgt:
%Vor% @JFSebastian weist darauf hin, dass dieser Algorithmus den Vorteil hat, dass er O (1) und nicht O (n) ist, wie in diesem ausgezeichneter Artikel über den Unterschied zwischen einer linearen und iterativen Rekursion, wenn sie mit @tail_call_optimized
decorator verwendet wird.