Python rekursive Funktion, die von 0 bis n?

Ich versuche, eine rekursive Funktion zu schreiben, die von 0 bis n druckt, aber ich habe keine Ahnung, wie es geht Ich habe zufällig eine gemacht, die von n bis 0 druckt:

def countdown(n): print(n) if n == 0: return 0 return countdown(n - 1) 

Ich weiß nicht, ob das hilft oder nicht, vielleicht kann ich etwas aus dem Code ändern, um es von 0 zu n zu machen?

3 Solutions collect form web for “Python rekursive Funktion, die von 0 bis n?”

Sie haben es fast geschafft! Hier ist eine feste, vereinfachte Version:

 def countup(n): if n >= 0: countup(n - 1) print(n) 

Beachte das:

  • Sie müssen nichts von einer rekursiven Funktion zurückgeben, die nur Werte druckt
  • Für das Drucken in aufsteigender Reihenfolge muss die Druckanweisung nach dem rekursiven Aufruf platziert werden
  • Die Rekursion beendet, wenn n < 0 , da wir nur drucken, es ist nichts mehr übrig zu tun und es ist ok, um zurückzukehren None (Python's Rückgabewert)

AKTUALISIEREN

Es scheint, dass das Schreiben einer Schwanz rekursive Lösung ist all die Wut um hier 🙂 oh gut, hier ist mein Schuss auf sie, eine vereinfachte und tail-rekursive Version von @ AndyHayden Idee – mit dem Schwanz Anruf Optimierung Dekorateur Rezept :

 @tail_call_optimized def countup(N, n=0): print(n) if n < N: countup(N, n + 1) 

So oder so funktioniert es wie erwartet:

 countup(5) => 0 1 2 3 4 5 

Du bist dort etwa 99%.

Denken Sie an Ihren Basisfall und Ihren rekursiven Schritt – wenn Sie 0 treffen, was möchten Sie tun? Wenn du immer noch von n , was willst du denn passieren?

Wenn Sie die Reihenfolge rückgängig machen, in der Sie den Wert drucken, erreichen Sie das gewünschte Ergebnis.

 def countdown(n): if n != 0: countdown(n-1) print(n) 

Der Grund dafür ist, dass rekursive Anrufe auf den Anrufstapel gehen. Wenn du Anrufe auf den Stapel drückst, während dein Endfall nicht erfüllt ist, wirst du noch mehr Anrufe hinzufügen, bis du deinen Basisfall von n == 0 , und dann wirst du exklusiv mit dem Drucken der Werte beginnen.

Die anderen Anrufe werden dann bis zur Druckerklärung fallen, da ihre Ausführung nach der Bedingung in die Zeile zurückgekehrt ist.

So sieht der Anrufstapel so aus:

 countdown(5) countdown(4) countdown(3) countdown(2) countdown(1) countdown(0) print(0) print(1) print(2) print(3) print(4) print(5) 

Sie können die 0 und die n, und die + mit a – ersetzen, um Ihre rekursive Countdown-Funktion zu einem rekursiven Countup zu machen:

 def countup(N, n=0): print(n) if n == N: return return countup(N, n + 1) 

Und nennen Sie es wie folgt:

 countup(3) 

@JFSebastian weist darauf hin, dass dieser Algorithmus den Vorteil hat, O (1) anstatt O (n) zu sein, wie in diesem ausgezeichneten Artikel über den Unterschied zwischen einer linearen und iterativen Rekursion, wenn mit dem @tail_call_optimized Dekorateur verwendet @tail_call_optimized .

  • Rekursive Funktion gibt keine in Python zurück [doppelte]
  • Ist es möglich, die Rekursion aus dieser Funktion zu entfernen?
  • Ich versuche, eine Funktion zu machen, die max aus verschachtelter Liste zurückgibt?
  • Python recursion return Keine Typ
  • Lösen von vollständig versteckten Ausdrücken mit Rekursion
  • Warum gibt meine rekursive Funktion keine?
  • Den längsten Teilstring in alphabetischer Reihenfolge finden
  • Trennungsliste mit Rekursion
  • Python max Rekursion, Frage über sys.setrecursionlimit ()
  • Rekursiv finden Sie die kth größte int in Liste der Liste der int in Python
  • Das max-Element in einer Sequenz mit Rekursion zu finden
  • Python ist die beste Programmiersprache der Welt.