Rekursion mit und ohne return

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
reneh
User
Beiträge: 5
Registriert: Donnerstag 9. August 2018, 14:04

Hallo liebes Forum,

wir hatten in der Vorlesung ein Beispiel zu Rekursion gemacht:

Code: Alles auswählen

def kaboom(i):
    print(i)
    if i < 3:
        kaboom(i+1)
    print(i)

kaboom(1)
Als Output erhält man ja:
1
2
3
3
2
1

Die ersten drei Outputs sind mir klar, da solange i < 3 ist die Funktion erneut ausgeführt wird.
Ich verstehe nur nicht genau wie die drei Zeilen darunter zustande kommen. In unserem Skript steht nur als Stichwort Call Stack. Ich weiß was ein Stack ist, aber was hat der damit zu tun?

Und zuletzt verstehe ich nicht, warum die Ausgabe sich zu
1
2
3
3
ändert, wenn ich

Code: Alles auswählen

return kaboom(n-1) 
schreibe.

Kann mir das jemand erklären oder einen Link zu einer Erklärung schicken?

Danke und viele Grüße
René
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nimm dir doch mal ein Stueck Papier, oder mach einen Editor mit deinem Stueck Code auf. Und dann setzt du an der Stell, wo du kaboom rekursiv aufrufst einfach wieder den Code rein, der in Kaboom ist. Bis an die Stelle, wo das if nicht mehr greift. Dann wird das sofort klar.

Code: Alles auswählen

def kaboom(1):
    print(1)
    if 1 < 3: 
            # kaboom 1+1
            print(2)
            if 2 < 3:
              # etc...
            print(2)
    print(1)
Einrueckung ist natuerlich wichtig!
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Ein Funktionsaufruf muß wissen, wo es weiter gehen soll, wenn die Funktion fertig ist; das merkt sich Python auf dem Call-Stack. Wenn also kaboom zum dritten mal aufgerufen wird und mit der Ausgabe von 3 und 3 fertig ist, kehrt die Ausführung dahin zurück, wo kaboom in der zweiten Rekursion aufgehört hatte, also bei der Ausgabe von `2`, usw. Ein return beendet die Ausführung der Funktion, das `print` wird dann nicht ausgeführt.
reneh
User
Beiträge: 5
Registriert: Donnerstag 9. August 2018, 14:04

Vielen Dank! Nachdem ich mich bisschen mehr mit Call Stack beschäftigt habe, hab ich es nun verstanden. Merci!
Antworten