Seite 1 von 1
Rekursion Python Anfänger
Verfasst: Sonntag 15. Mai 2022, 22:40
von WayToValhalla
Hallo an alle.
Ich bin Python Anfänger und hänge zur Zeit am Verständniss der Rekursion. Folgendes will sich bei mir im Kopf einfach nicht setzen. Mal das wohl bekannteste Beispiel:
Code: Alles auswählen
def Fakultät(n):
if n == 1:
return 1
else:
return n * Fakultät(n-1)
print(Fakultät(4))
24
Wieso wird die Funktion denn überhaupt mehr als einmal aufgerufen? Wieso wird nicht die else Bedingung einmalig ausgeführt und endet dann? Wieso wird die Funktion so lange wiederholt, bis n ==1 ist? Ich dachte eigentlich ,dass wenn die eine Bedingung nicht erfüllt ist, dann die else Bedingung ausgeführt wird. Aber dies sollte doch nur einmal passieren. Was führt also zu der eigentlichen Rekursion? Ich weiß, das ist wahrscheinlich ne ziemlich blöde Frage, aber irgendwie verhindert es für mich, dass ganze überhaupt zu verstehen.
Re: Rekursion Python Anfänger
Verfasst: Sonntag 15. Mai 2022, 22:42
von WayToValhalla
Sorry für den nicht eingerückten Code, ist aber mit dem Smartphone echt ein Krampf.
Edit: Code jetzt doch ordentlich eingerückt

Re: Rekursion Python Anfänger
Verfasst: Montag 16. Mai 2022, 04:48
von sparrow
Da ist kein Code.
Und wenn du Code zwischen Code-Tags posten, musst du dir über die Einrückung keine Gedanken machen.
Code Tags werden eingefügt, wenn du im vollständigen Editor den </> -Button drückst.
Re: Rekursion Python Anfänger
Verfasst: Montag 16. Mai 2022, 10:29
von imonbln
WayToValhalla hat geschrieben: Sonntag 15. Mai 2022, 22:40
Wieso wird die Funktion denn überhaupt mehr als einmal aufgerufen? Wieso wird nicht die else Bedingung einmalig ausgeführt und endet dann? Wieso wird die Funktion so lange wiederholt, bis n ==1 ist? Ich dachte eigentlich ,dass wenn die eine Bedingung nicht erfüllt ist, dann die else Bedingung ausgeführt wird. Aber dies sollte doch nur einmal passieren. Was führt also zu der eigentlichen Rekursion? Ich weiß, das ist wahrscheinlich ne ziemlich blöde Frage, aber irgendwie verhindert es für mich, dass ganze überhaupt zu verstehen.
Das Else der Fakultät(n) wird auch nur einmal aufgerufen und die Funktion endet dann, aber vorher wird das Fakultät(n-1) ausgeführt, dass auch wieder ein Else hat, welches nach dem Ausführen der Fakultät(n-2) sofort beendet wird und so weiter.
Ich habe mal deinen Code um 2 Print ausgaben erweitert, vielleicht hilft es dir zu verstehen, wie die Rekursion das Problem löst. Apropos, Funktionen in Python werden immer komplett kleingeschrieben, ich habe das gleich angepasst.
Code: Alles auswählen
def factorial(n):
print(f"current call: factorial({n})")
if n == 1:
return n
print(f" next call with {n -1 }")
return factorial(n -1) * n
Re: Rekursion Python Anfänger
Verfasst: Montag 16. Mai 2022, 10:31
von __blackjack__
@WayToValhalla: Du rufst die Funktion `Fakultät()` mit dem Wert 4 auf. Der ist ungleich 1 also geht es in den ``else``-Zweig. Und in dem wird ja offensichtlich die Funktion `Fakultät()` aufgerufen. Warum verstehst Du nicht das eine Funktion aufgerufen wird, wenn da ein Funktionsaufruf steht? Was sollte denn da sonst Deiner Meinung nach passierebn? Um den ``else``-Zweig komplett auszuführen muss das `n` ja mit einem Wert multipliziert werden; welcher sollte das denn sein wenn die Funktion auf der rechten Seite vom ``*``-Operator nicht aufgerufen wird um den Wert zu ermitteln?
Re: Rekursion Python Anfänger
Verfasst: Montag 16. Mai 2022, 12:48
von WayToValhalla
imonbln hat geschrieben: Montag 16. Mai 2022, 10:29
Das Else der Fakultät(n) wird auch nur einmal aufgerufen und die Funktion endet dann, aber vorher wird das Fakultät(n-1) ausgeführt, dass auch wieder ein Else hat, welches nach dem Ausführen der Fakultät(n-2) sofort beendet wird und so weiter.
Ich habe mal deinen Code um 2 Print ausgaben erweitert, vielleicht hilft es dir zu verstehen, wie die Rekursion das Problem löst. Apropos, Funktionen in Python werden immer komplett kleingeschrieben, ich habe das gleich angepasst.
Code: Alles auswählen
def factorial(n):
print(f"current call: factorial({n})")
if n == 1:
return n
print(f" next call with {n -1 }")
return factorial(n -1) * n
Super, vielen Dank, das verdeutlicht es richtig gut. Nun weiß ich auch wo letztendlich mein Fehler lag. Ich habe den else Bereich nicht als weiteren Funktionsaufruf gesehen, sondern war der Meinung, es wird einfach nur die Rechenoperation ausgeführt (also n * der der Funktion übergebene Parameter - 1).
Beschäftige mich erst seit 2 Wochen mit Programmieren. Einiges klappt schon sehr gut, aber manchmal dreht sich einem bei manchen Sachen dermaßen der Kopf und man erkennt die einfachsten Dinge nicht. Von daher vielen Dank für die schnelle Hilfe, auch an __blackjack__
