Rekursion, verstehe nicht, was da passiert.

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
pww
User
Beiträge: 2
Registriert: Samstag 21. März 2020, 15:14

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?
__deets__
User
Beiträge: 14537
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nicht bei mir, wenn ich das im Terminal laufen lasse.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

@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)
pww
User
Beiträge: 2
Registriert: Samstag 21. März 2020, 15:14

@ __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!
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

@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.
Antworten