Rekursion Python Anfänger

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
WayToValhalla
User
Beiträge: 3
Registriert: Sonntag 15. Mai 2022, 22:22

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.
Zuletzt geändert von WayToValhalla am Sonntag 15. Mai 2022, 22:59, insgesamt 2-mal geändert.
WayToValhalla
User
Beiträge: 3
Registriert: Sonntag 15. Mai 2022, 22:22

Sorry für den nicht eingerückten Code, ist aber mit dem Smartphone echt ein Krampf.
Edit: Code jetzt doch ordentlich eingerückt :D
Zuletzt geändert von WayToValhalla am Sonntag 15. Mai 2022, 22:49, insgesamt 1-mal geändert.
Benutzeravatar
sparrow
User
Beiträge: 4165
Registriert: Freitag 17. April 2009, 10:28

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.
imonbln
User
Beiträge: 149
Registriert: Freitag 3. Dezember 2021, 17:07

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
Benutzeravatar
__blackjack__
User
Beiträge: 13006
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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?
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
WayToValhalla
User
Beiträge: 3
Registriert: Sonntag 15. Mai 2022, 22:22

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__ :D
Antworten