2016-12-22 13 views
0

誰かがこの階乗関数がそのような出力をどのように出力するかを一歩一歩説明できますか?私は最初のn = 5がn == 1と一致しないので、それが中間のステートメントに続くすべての階乗をなぜ印刷するのか理解していないので、elseステートメントに行き、中間を出力します。Python Factorial Recursion関数

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

ちょうどデバッガを使用して関数に従ってください、あなたは理解します。呼び出される関数がある限り、最初に呼び出されたものは終了しません。コール印刷は、中間結果の前に行われます。 –

+0

これは再帰の基本原則です。完全に実行される最初の関数が最後に呼び出されます。 – iFlo

+0

@ Jean。どのデバッガを使用できますか?私はcmdを使うだけです。 – user1902849

答えて

3

階乗値を計算するために再帰関数を使用しています。したがって、elseステートメントに達すると、次のステートメントを実行する代わりに、 "factorial(n-1)"関数を再度呼び出すように制御が移ります。だから、その声明が再び呼び出されたとき、

print("factorial has been called with n = " + str(n)) 

が印刷されます。

「スタック」データ構造はこの再帰関数の背後で使用されるため、したがって、関数呼び出しステートメントのためにコントロールが動くたびに、プログラムの以前の状態がスタックにプッシュされ、1つずつ "LIFO"方式でポップされます。だからこそ出力の理由です。

これらの2つのリンクを参照してください。あなたはそれをよりよく理解するでしょう。最初の呼び出しで

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

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

+0

OK、なぜ私は階乗文を印刷したのか理解しています。しかし、今私の質問は一度n == 1それはなぜ別の文に行く1を返す必要がありますか?この場合、「スタック」はどのように機能していますか? – user1902849

+0

良い質問。 n == 1になると、実際にはreturn文になります。したがって、スタック関数のTOPのみが返され、スタックから次の状態がポップされます。スタック自体は関数呼び出しステートメントです。あなたが流れを理解することを願っています。 –

+0

申し訳ありませんが、私はこれを取得していません。このプロセスを視覚化する方法はありますか? – user1902849

0
実際

、N = 5。 "factorialが呼び出されました..."というメッセージを出力し、 "n == 1なら"と入力して "else"に行きます。これは最初にローカルn = 4で階乗を呼び出し、 "中間結果"を出力します。 .. "階乗の各呼び出しは、else文を実行しない最後の階乗(1)呼び出しを除いて、それらの2つを出力することが期待されるので、 "中間"のものを出力しません。