Rekursive Funktion - Ablauf verstehen

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
Juergen2019
User
Beiträge: 3
Registriert: Sonntag 16. Juni 2019, 13:18

Hallo Zusammen,

Ich brüte schon seit Stunden über den Ablauf der Rekursiven Funktion.
Hierfür habe ich ein einfaches Programm geschrieben:

Code: Alles auswählen

def summe(n):
    if n==0:
        return 0
    else:
        erg= n+summe(n-1)
        return erg
print(summe(3),"ende")
AUSGABE:
6 ende

So weit so gut.
Nun wollte ich mir die Programmabfolge näher ansehen und habe print-Befehle eingefügt:

Code: Alles auswählen

Z1        def summe(n):
Z2                    print("n hat Wert: " + str(n))
Z3                   if n==0:
Z4                       print(n,"n==0 Abbruchkriterium")
Z5                       return 0
Z6                   else:
Z7                       erg= n+summe(n-1) #Berechnung: 3+2+1+0 (die 0 wird vom Abbruchkriterium zurückgegeben) = 6       # n hat zuletzt den Wert 1???
Z8                       print("Zwischenwert n: ", n ,"Ergebnis zu Zwischenwert (n-1) - erg: ", erg) #erg wird NOCHMAL berechnet mit dem aktuellen (n-1)-                                                                                                                                                Wert = 1
Z9                       return erg #gibt den ersten berechneten Wert an den Funktionsaufruf  print(summe(3),"ende")  weiter. Danach an print(Zwischenwert n: …)
Z10      print(summe(3),"ende")
DIE AUSGABE:
ZE1 n hat Wert: 3
ZE2 n hat Wert: 2
ZE3 n hat Wert: 1
ZE4 n hat Wert: 0
ZE5 0 n==0 Abbruchkriterium
ZE6 Zwischenwert n: 1 Ergebnis zu Zwischenwert (n-1) - erg: 1
ZE7 Zwischenwert n: 2 Ergebnis zu Zwischenwert (n-1) - erg: 3
ZE8 Zwischenwert n: 3 Ergebnis zu Zwischenwert (n-1) - erg: 6
ZE9 6 ende

Ich verstehe es folgendermaßen:
Version 1 – n =1 in Z7
ZE1-ZE5 Berechnung in Z7 mit dem Ergebnis 6. Diese Ergebnis wird an Z10 übergeben. n hat den Wert 1
ZE6 wenn nun n=1, dann ist die Zeile ok
ZE7-ZE8 wie kann nun n den Wert 2 bzw. 3 annnehmen?
ZE9 Rückgabewert der ersten Berechnung von erg.

Version 2 – n verändert sich nicht und hat nach Z7 den Wert 3 (n=3)
Dann müssten ZE6-ZE8 nicht so aussehen?
ZE6 Zwischenwert n: 3 Ergebnis zu Zwischenwert (n-1) - erg: 6
ZE7 Zwischenwert n: 2 Ergebnis zu Zwischenwert (n-1) - erg: 3
ZE8 Zwischenwert n: 1 Ergebnis zu Zwischenwert (n-1) - erg: 1

Kann mir jemand behilflich sein?

Grüße
Jürgen
Juergen2019
User
Beiträge: 3
Registriert: Sonntag 16. Juni 2019, 13:18

Oh, Ich denke, ich habe die Antwort gefunden.
Version 1 ist die richtige.
Rekursion wird in der Regel durch einen Stack implementiert, der die Rücksprungadressen, aber auch alle lokalen Variablen und evtl. Funktionsergebnisse aufnimmt.
Die Abarbeitung erfolgt nach dem First in First out Prinzip.
Wenn es falsch ist, dann dürft Ihr mich gerne korrigieren.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

@Juergen2019: von welcher Version 2 sprichst Du? Du hast nur einen Code gezeigt.

Und wenn Du richtigerweise von einem Stack sprichst, das Prinzip ist dort „last in, first out“.
Juergen2019
User
Beiträge: 3
Registriert: Sonntag 16. Juni 2019, 13:18

Hallo Sirius,
ja stimmt - last in first out.
Vielen Dank für den Hinweis.
Version1 ist mein erster Lösungsvorschlag weiter unten im Beitrag.
Grüße
Jürgen
Antworten