Seite 1 von 1
Rekursion, verstehe nicht, was da passiert.
Verfasst: Mittwoch 27. Mai 2020, 13:41
von pww
Hallo!
Ich habe ein Verständnisproblem mit folgendem Code:
Code: Alles auswählen
1 def print_n(s,n):
2 if n <= 0:
3 return
4 print(s)
5 print_n(s, n-1)
6 print('Hier geschieht für mich rätselhaftes')
print_n('Hey Leuts! ', 2)
"Hey Leuts!" wird zweimal ausgegeben. Danach ist n<=0 erfüllt und das Programm führt Zeile 6 als nächstes aus. Die Zeile 6 wird jedoch n-mal ausgegeben! Warum?
Re: Rekursion, verstehe nicht, was da passiert.
Verfasst: Mittwoch 27. Mai 2020, 14:07
von __deets__
Nicht bei mir, wenn ich das im Terminal laufen lasse.
Re: Rekursion, verstehe nicht, was da passiert.
Verfasst: Mittwoch 27. Mai 2020, 14:14
von sparrow
@pww: Der Ablauf des Programms ist nicht so, wie du denkst.
Du solltest mal Zeile für Zeile aufschreiben, was gerade getan wird.
Die Funktion wird ja rekursiv in Zeile 5 wieder aufgerufen. Und wenn diese Funktion wieder zurück kommt, dann wird der Code in der Zeile danach fortgesetzt. Und das ist natürlich Zeile 6.
Vielleicht wird es dir so klarer:
Code: Alles auswählen
def recursion_test(text, limit):
print(f"Ich bin am Anfang , limit ist {limit}")
limit_at_start = limit
if limit <= 0:
return
print(text)
recursion_test(text, limit-1)
print(f'Ende. limit ist {limit} und war am Anfang {limit_at_start}')
recursion_test('Hey Leuts! ', 3)
Re: Rekursion, verstehe nicht, was da passiert.
Verfasst: Mittwoch 27. Mai 2020, 14:30
von pww
@ __deets__ Habe ich im Terminal probiert, gleiche Ergebnis. Habe es bisher in pycharm laufen lassen.
@sparrow Eben, Zeile fünf wird so lange aufgerufen bis x<=0 ist. Aber warum wird Zeile 6 dann noch n-mal ausgegeben, wobei n beim ersten Mal in Zeile 6 n=1, beim zweiten Durchlauf n=2 ... Was passiert da! Zeile 6 sollte meiner Auffassung nach nur noch einmal durchlaufen werden, und dann die Funktion verlassen!
Re: Rekursion, verstehe nicht, was da passiert.
Verfasst: Mittwoch 27. Mai 2020, 14:39
von sparrow
@pww hast du den Code von mir mal laufen lassen?
Du verwechselst Rekursion mit einer Schleife.
Der Ablauf ist wie folgt:
Code: Alles auswählen
Aufruf recursion_test mit limit = 3
Sprung zum Anfang von recursion_test limit = 3
Ausgabe von Text
Aufruf von recursion_test mit limit-1
Sprung zum Anfang von recursion_test limit = 2
Ausgabe von Text
Aufruf von recursion_test mit limit-1
Sprung zum Anfang von recursion_test limit = 1
Ausgabe von Text
Aufruf von recursion_test mit limit-1
Sprung zum Anfang von recursion_test limit = 0
limit <= 0; zurückkehren der Funktion mittels return; Wert = None
Forführen der Funktion. Ausgabe limit = 1
implizites zurückkehren der Funkttion durch Ende, Wert = None
Fortführen der Funktion. Ausgabe limit = 2
implizites zurückkehren der Funktion durch Ende, Wert = None
Fortführen der Funktion. Ausgabe limit = 3
implizites zurückkehren der Funktion durch Ende, Wert = None
Forführen des Programms nach dem ersten Aufruf von recursion_test mit limit = 3
Jedes Einrückungslevel entspricht hier einem Rekursionslevel. Wenn du eine Funktion aufrufst, dann springt sie nach der Rückkehr (explizit durch den Aufruf von return oder impizit durch ihr Ende) wieder an den Ort ihres Aufrufs zurück. Und der Code läuft danach weiter.