編輯 - 我已經解決了這個問題,但如果沒問題,我希望這里的專家仍然解釋這個問題,以便其他初學者可以學習。你會做得更好解釋。
我正在嘗試學習遞回,并且有點了解遞回的想法(將一個大問題分成較小的解決方案,然后將它們組合在一起。不過,我對這個特定問題有一些疑問。階乘。
def fact(n):
if n==1:
return 1
else:
return n*fact(n-1)
問題是,在每次遞回時將 n 值減 1 后,我并不確切知道計算是如何完成的。例如,如果 n = 5,則 n 值將每次下降 1 (5,4,3,2,1)。我不明白的是,這些值會發生什么?它們是什么時候真正加起來的?有人可以逐步撰寫輸出或 n 值發生了什么嗎?我試圖在 PythonTutor 上將其可視化,這很有幫助但不是很有幫助。

如果你們覺得這是一個重復的問題或非常常見的問題,請將我鏈接到類似(Youtube)的來源,其中對此進行了解釋。非常感謝。
uj5u.com熱心網友回復:
為了回答你的問題,我首先需要提醒你注意程式中可能發生的兩件事。當然是IF 下的代碼和 ELSE 下的代碼。暫時記住它。
讓我們看看你的問題:這些值會發生什么?它們什么時候真正相乘在一起?
現在假設我們有 n = 3,所以讓我們閱讀 ELSE BLOCK 下的代碼(因為 n != 1),看看會發生什么。
我們有return n*fact(n-1)and 因為 n = 3, -->return 3*fact(3-1)
在這里你可能會開始看到它,在這個塊之后并沒有回傳3*fact(3-1)任何東西,你需要了解 IF 陳述句的存在是有原因的。因為如果我們沒有那個 IF 代碼塊,我們將不會停止遞回,即:它將始終回傳函式 fact(...)。
所以逐漸發生的事情:
- 事實(n=3):n!= 3,(其他塊),
return 3*fact(3-1) - 事實(n=2):n!= 2,(其他塊),
return 3*2*fact(2-1) - fact(n=1) : n == 1 , (IF BLOCK) ,
return 1(我們回傳 1 而不是 1 所以我們停止并計算所有)
事實(n=3)= 3 * 2 * 1 = 6
總而言之,這些值會發生什么,它們被堆疊在一起直到最后一個回傳陳述句(IF STATEMENT),然后它們被計算出來。
uj5u.com熱心網友回復:
此遞回在 n = 1 處具有終止條件。這意味著它在 n = 1 處回傳一個常量值,并且不會開始另一個遞回呼叫。如果 n 是> 1,它將回傳n*fact(n-1)。
事實(5)的呼吁:
5*fact(4)5*(4*fact(3))5*(4*(3*fact(2)))5*(4*(3*(2*fact(1))))5*(4*(3*(2*1)))
uj5u.com熱心網友回復:
第一個if條件是微不足道的,因為 1! = 1,(我會使用if n<=1,因為也是 0!= 1)。如果數字 N 大于 1,則該函式回傳該數字乘以 N-1 的同一函式的結果,因此該函式將遍歷所有整數,直到它達到 1。
假設 N=3:
if條件進入部分else,因為 3>1- 函式回傳什么是 3 * fact(2),但 fact(2) 是什么?是一個回傳 2 * fact(1) 的函式,因為 2>1
- 所以最后你得到的回報是 3 * 2 * fact(1),知道 fact(1) 回傳 1(你激活
if條件),你得到 6=3!
希望這有幫助
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/520620.html
標籤:Python递归尾递归
上一篇:如何在OCaml中執行組合數函式
