2016-12-22 3 views
0

Kann mir jemand Schritt für Schritt erklären, wie diese faktorielle Funktion solche Ausgaben ausgibt? Ich verstehe nicht, warum es alle faktoriellen drucken, dann folgen Zwischenanweisung, da zuerst n = 5 nicht übereinstimmt n == 1, so dass es zu else Anweisung gehen und intermediate ausdrucken wird.Python-Faktorielle Rekursionsfunktion

def factorial(n): 
print("factorial has been called with n = " + str(n)) 
if n == 1: 
    return 1 
else: 
    res = n * factorial(n-1) 
    print("intermediate result for ", n, " * factorial(" ,n-1, "): ",res) 
    return res 

print(factorial(5)) 

factorial has been called with n = 5 
factorial has been called with n = 4 
factorial has been called with n = 3 
factorial has been called with n = 2 
factorial has been called with n = 1 
intermediate result for 2 * factorial(1): 2 
intermediate result for 3 * factorial(2): 6 
intermediate result for 4 * factorial(3): 24 
intermediate result for 5 * factorial(4): 120 
120 
+0

Folgen Sie einfach die Funktion mit einem Debugger, Sie werden es verstehen. Der erste Aufruf wird nicht beendet, solange Funktionen aufgerufen werden. Der Anrufdruck erfolgt vor dem Zwischenergebnis. –

+0

Dies ist das Grundprinzip der Rekursion. Die erste vollständig auszuführende Funktion ist die zuletzt aufgerufene. – iFlo

+0

@ Jean. Welchen Debugger kann ich verwenden? Ich benutze nur cmd. – user1902849

Antwort

3

Sie verwenden die Rekursionsfunktion zur Berechnung des faktoriellen Werts. Also, wenn Sie diese else-Anweisung erreichen,

else: 
    res = n * factorial(n-1) 

geht die Steuerung auf die Funktion „factorial (n-1)“ Aufruf wieder statt nächsten Anweisungen auszuführen. Wenn die Anweisung erneut aufgerufen wird, wird die Nachricht

gedruckt.

Da "Stack" Datenstruktur hinter dieser Rekursionsfunktion verwendet wird. Daher wird der vorherige Zustand des Programms immer dann in den Stapel geschoben, wenn das Steuerelement für die Funktionsaufrufanweisung verwendet wird, und nacheinander auf eine "LIFO" -Weise ausgegeben. Deshalb der Grund für die Ausgabe.

Siehe diese 2 Links. Du wirst es besser verstehen.

https://www.youtube.com/watch?v=k0bb7UYy0pY

http://www.programmerinterview.com/index.php/recursion/explanation-of-recursion/

+0

OK, jetzt verstehe ich, warum es faktorielle Aussage ausgedruckt hat. Aber meine Frage ist jetzt einmal n == 1 sollte es 1 zurückgeben, warum es zur anderen Aussage gehen wird? Wie funktioniert der 'Stack' in diesem Fall? – user1902849

+0

Gute Frage. Wenn es zu n == 1 geht, geht es tatsächlich zur Rückkehranweisung. Daher gibt nur TOP der Stapelfunktion nur zurück, dann springt der nächste Zustand aus dem Stapel, der selbst eine Funktionsaufrufanweisung ist. Hoffe, du hast den Fluss verstanden. –

+0

Entschuldigung, ich habe das nicht verstanden. Gibt es einen Weg, diesen Prozess zu visualisieren? – user1902849

0

Tatsächlich n = 5 im ersten Anruf. Also druckst du "factorial wurde aufgerufen ...", dann gib "if n == 1" nicht ein und gehe zu "else", das zuerst factorial mit einem lokalen n = 4 aufruft und nach dem Ausdruck "intermediate result. .. ". Es wird erwartet, dass jeder Aufruf von Fakultäten diese zwei ausdruckt, mit Ausnahme des letzten faktoriellen (1) Aufrufs, der die else-Anweisung nicht ausführt und daher die "Zwischen" -Dinge nicht ausgibt.

Verwandte Themen