儘管遞迴可以通過迴圈來實現,但是往往遞迴**更加簡潔,邏輯更加清晰,先來看一段python遞迴**:
def fact(n):
if n == 1:
return 1
else:
return fact(n-1)*n
print(fact(5))
該遞迴呼叫的過程如下:
計算機在呼叫函式時會使用堆疊,每呼叫乙個函式會增加一層棧幀,所以當遞迴過程多次呼叫函式的時候可能會導致大小有限的堆疊溢位,這個時候我們需要對遞迴函式做一些稱之為"尾遞迴"的處理,所謂尾遞迴就是將return中的表示式迴圈化,使遞迴呼叫始終呼叫同乙個函式,只使用乙個棧幀,從而有效防止堆疊溢位。對上面的**進行處理:
def fact(n):
return fact_be(n, 1)
def fact_be(num,sum):
if num ==1:
return sum
else:
return fact_be(num-1,num*sum)
print(fact(5))
呼叫過程如下:
即每次呼叫都返回遞迴函式本身,num和sum之前就算好了。
遞迴函式的優化
為什麼要優化遞迴 先看個例子 遞迴裴波那切數列 function fibonacci n else function t n t 35 t 40 t 42 列印結果如下 9227465 a 57.330ms 102334155 a 589.497ms 267914296 a 1550.535ms正常...
python遞迴 Python 與尾遞迴優化
有很多時候,使用遞迴的方式寫 要比迭代更直觀一些,以下面的階乘為例 def factorial n if n 0 return 1 return factorial n 1 n 但是這個函式呼叫,如果展開,會變成如下的形式 factorial 4 factorial 3 4 factorial 2 ...
Python 的尾遞迴優化
有很多時候,使用遞迴的方式寫 要比迭代更直觀一些,以下面的階乘為例 def factorial n if n 0 return 1return factorial n 1 n 但是這個函式呼叫,如果展開,會變成如下的形式 factorial 4 factorial 3 4 factorial 2 3...