python-rekursive Funktion, die Drucke von 0 bis n?
Bin ich zu schreiben versucht, eine rekursive Funktion, die Drucke von 0
zu n
, aber ich habe keine Ahnung, wie es zu tun. Ich habe versehentlich eins gemacht, die Drucke von n
zu 0
obwohl:
def countdown(n):
print(n)
if n == 0:
return 0
return countdown(n - 1)
Ich weiß nicht, ob das hilft oder nicht, kann ich vielleicht etwas ändern im code zu machen geht es aus 0
zu n
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie hat es fast! hier ist eine Feste, vereinfachte version:
Beachten Sie, dass:
print
- Anweisung gesetzt werden muss nach des rekursiven Aufrufsn < 0
angesichts der Tatsache, dass wir nur drucken, es gibt nichts mehr danach gemacht werden, und es ist ok, um zurückNone
(Python Standard-Rückgabewert)UPDATE
Scheint es, dass das schreiben eine tail-rekursive Lösung ist der Letzte Schrei hier Rum 🙂 naja, hier ist meine Chance, ein Vereinfachtes und tail-rekursive version von @AndyHayden Idee - die Verwendung der tail-call-Optimierung decorator Rezept:
Entweder Weg, funktioniert es wie erwartet:
Sind Sie zu 99% dort.
Denken Sie an Ihre base-case und Ihren rekursiven Schritt - wenn Sie auf 0, was möchten Sie tun? Wenn Sie noch arbeiten Sie Ihren Weg nach unten von
n
, was Sie wollen passieren?Wenn Sie die Bestellung stornieren, in dem Sie drucken den Wert, Sie erreichen Ihr gewünschtes Ergebnis.
Der Grund, warum dies funktioniert, ist, dass rekursive Aufrufe gehen auf dem call-stack. Wie Sie push-Aufrufe auf den stack, während Ihre end-Fall nicht erfüllt, Sie halten das hinzufügen mehr anrufen, bis Sie Ihre Basis erreichen bei
n == 0
, und dann werden Sie ausschließlich drucken starten Sie die Werte.Die anderen Anrufe werden dann fallen Sie durch, um die print-Anweisung, Ihre Ausführung zurückgegeben hat, um die Zeile nach der Bedingung.
So, den call-stack sieht wie folgt aus:
n
stack-frames, aber Andy hat zwei lokale Variablen pro Bild, in der Erwägung, dass diese nur einen hat.for i in xrange(10): print i
das noch weniger Speicher. In Bezug auf Praktikabilität, Sie können immer ersetzen stack Rekursion für heap-Rekursion, oder verwenden Sie Stackless Python, aber ich bin damit einverstanden, dass die Rekursion ist unangebracht in diesem Fall. Es ist jedoch rein akademisch, und nicht etwas, was Sie jemals tun in der Praxis.Können Sie ersetzen Sie die 0 und die n, und die + mit -, um Ihre rekursive countdown-Funktion, um eine rekursive countup:
Und rufen Sie es wie folgt:
@JFSebastian Punkte out dieser Algorithmus hat den Vorteil, dass Sie O(1) anstatt O(n), wie bereits in diesem exzellente Artikel über den Unterschied zwischen linearer und iterativer Rekursion, wenn verwendet mit der
@tail_call_optimized
Dekorateur.n
es nicht mehr gedruckt von0
zun
-es druckt anstelle vonn
zuN
.n
, wird es nun gebunden vonn
zuN
.n
.n
zuN
statt0
zun
.return countup
in einemelse
und fügen Sie denprint(n)
im selbenelse
countup(4)
es druckt 0,1,2,3,4,4Können Sie dies tun,