Seite 1 von 1

Rekursion mit und ohne return

Verfasst: Donnerstag 9. August 2018, 14:17
von reneh
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é

Re: Rekursion mit und ohne return

Verfasst: Donnerstag 9. August 2018, 14:27
von __deets__
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!

Re: Rekursion mit und ohne return

Verfasst: Donnerstag 9. August 2018, 14:33
von Sirius3
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.

Re: Rekursion mit und ohne return

Verfasst: Freitag 10. August 2018, 12:42
von reneh
Vielen Dank! Nachdem ich mich bisschen mehr mit Call Stack beschäftigt habe, hab ich es nun verstanden. Merci!