python rekursive Funktion, die von 0 bis n druckt?

8

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:

druckt %Vor%

Ich weiß nicht, ob das hilft oder nicht, vielleicht kann ich etwas im Code ändern, damit es von 0 nach n geht?

    
user2489526 15.06.2013, 19:53
quelle

4 Antworten

8

Du hast es fast verstanden! Hier ist eine feste, vereinfachte Version:

%Vor%

Beachten Sie Folgendes:

  • Sie müssen nichts von einer rekursiven Funktion zurückgeben, die nur Werte
  • ausgibt
  • Zum Drucken in aufsteigender Reihenfolge muss die print -Anweisung nach dem rekursiven Aufruf platziert werden
  • Die Rekursion wird beendet, wenn n < 0 , da wir nur drucken, bleibt nichts mehr übrig und es ist ok, None (Pythons Standard-Rückgabewert)
  • zurückzugeben

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%     
Óscar López 15.06.2013, 20:01
quelle
12

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%     
Makoto 15.06.2013 19:57
quelle
3

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.

    
Andy Hayden 15.06.2013 19:57
quelle
0

Sie können dies tun

%Vor%     
Baishakhi Dasgupta 14.03.2018 09:47
quelle

Tags und Links