我有這個簡單的遞回函式,它正在計算一個數字的階乘。結果很好,它就像一個魅力。
def factorial(y):
if y == 0:
return 1
elif y == 1:
return 1
else:
result = y * factorial(y - 1)
print(result)
return result
為了理解這個程序,我添加了print(result)函式來查看遞回函式每次迭代時結果變數的值。
輸出為:
2
6
24
120
我期待這個輸出:
120
24
6
2
那么,為什么我的遞回函式是從最低數字迭代到最高數字而不是從最高數字迭代到最低數字?
uj5u.com熱心網友回復:
當result = y * factorial(y - 1)
被評估時,乘法只能在兩個運算元都被先評估時發生。所以首先必須進行遞回呼叫。這意味著在啟動所有遞回呼叫之前不會發生乘法。只有當遞回“展開”并且呼叫者獲得所需的運算元值時,才會計算乘法。
換句話說,它是“在回傳的路上”,乘法運算子將因子(左側運算元)與前一個乘積(右側運算元)累加到一個新乘積中。
uj5u.com熱心網友回復:
最里面的呼叫首先完成,因此首先列印。
最外層的呼叫僅在所有內部呼叫完成后才準備就緒,因此必須僅在內部呼叫完成后才列印。
試試這個有趣的:
def factorial(y, level=0):
if y == 0:
return 1
elif y == 1:
return 1
else:
print(level*" ", "pre-call, y=", y)
result = y * factorial(y - 1, level=level 2)
print(level*" ", "post-call, result=", result)
return result
factorial(5)
輸出是:
pre-call, y= 5
pre-call, y= 4
pre-call, y= 3
pre-call, y= 2
post-call, result= 2
post-call, result= 6
post-call, result= 24
post-call, result= 120
嵌套有助于顯示遞回級別。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/507847.html
下一篇:使用遞回動態創建React組件