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")
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")
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