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 .

  • Python-Rekursions-Permutationen
  • Den längsten Teilstring in alphabetischer Reihenfolge finden
  • Ich versuche, eine Funktion zu machen, die max aus verschachtelter Liste zurückgibt?
  • Rekursive Funktion gibt keine in Python zurück [doppelte]
  • Python: Rekursive Funktion, um die größte Zahl in der Liste zu finden
  • Rekursiv finden Sie die kth größte int in Liste der Liste der int in Python
  • Python-Funktion kehrt nach Rekursion nicht zurück
  • Merkwürdiges Rekursionsverhalten in Python
  • Maximales Niveau der Rekursion in Python
  • Rekursiv dekrementieren eine Liste durch 1
  • Ist diese Funktion rekursiv, obwohl sie sich nicht nennt?
  • Python ist die beste Programmiersprache der Welt.