遞歸函數 在函數內部調用自身本身 計算階乘: def fact(n): if n == 1: return 1 return n * fact(n - 1) 註意:使用遞歸函數需要防止棧溢出。 在電腦中,函數調用是通過棧(stack)實現,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回, ...
- 遞歸函數
在函數內部調用自身本身
計算階乘:
def fact(n): if n == 1: return 1 return n * fact(n - 1)
註意:使用遞歸函數需要防止棧溢出。
在電腦中,函數調用是通過棧(stack)實現,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減少一層棧幀。由於棧的大小不是無限的,所以遞歸調用的次數過多會導致棧溢出。
解決方法:尾遞歸優化。
尾遞歸: 在函數返回時,調用自身本身,且return語句不能包含表達式。
計算階乘:
def fact(n): return fact_iter(n, 1) def fact_iter(num, product): if num == 1: return product return fact_iter(num - 1, num * product)
fact(n)函數,由於return引入乘法表達式所以不是尾遞歸
fact_iter(num,product)函數,僅返回遞歸函數本身
尾遞歸調用如果做了優化,棧不會增長,無論多少次調用也不會導致棧溢出。
python標準的解釋器沒有針對尾遞歸做優化,任何遞歸函數都存在棧溢出的問題