求階乘: n!
def
fact
(n):
if n==1:
return
1return n * fact(n - 1)
理論上,所有的遞迴函式都可以寫成迴圈的方式,但迴圈的邏輯不如遞迴清晰
在計算機中,函式呼叫是通過棧(stack)這種資料結構實現的,每當進入乙個函式呼叫,棧就會加一層棧幀,每當函式返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞迴呼叫的次數過多,會導致棧溢位。
使用尾遞迴優化:
尾遞迴是指,在函式返回的時候,呼叫自身本身,並且,return語句不能包含表示式。這樣,編譯器或者直譯器就可以把尾遞迴做優化,使遞迴本身無論呼叫多少次,都只占用乙個棧幀,不會出現棧溢位的情況。
def
fact
(n):
return fact_iter(n, 1)
deffact_iter
(num, product): //每一次把乘積的結果作為引數傳進去
if num == 1:
return product
return fact_iter(num - 1, num * product)
針對尾遞迴優化的語言可以通過尾遞迴防止棧溢位。尾遞迴事實上和迴圈是等價的,沒有迴圈語句的程式語言只能通過尾遞迴實現迴圈。
python標準的直譯器沒有針對尾遞迴做優化,任何遞迴函式都存在棧溢位的問題。
什麼是尾遞迴
遞迴演算法想必大家都已經很熟悉了。遞迴演算法雖然簡單,但是容易導致一些效能問題,於是就有了尾遞迴這種優化演算法。首先我們先看看遞迴演算法的效能問題是在 比如我們有乙個常見的演算法,叫做階乘演算法。f x 1 2 3 x f x 1 cdot2 cdot3 cdots x f x 1 2 3 x他的遞...
什麼是 遞迴 和 尾遞迴
一 生活中的例子 場景 問路 遞迴 問題 天安門怎麼走?等待回答 a 左拐。接下來怎麼走不知道了,你等下,我去問b a等待b的回答 b 右拐。接下來怎麼走不知道了,你等下,我去問c b等待c的回答 c 左拐。接下來怎麼走不知道了,你等下,我去問d c等待d的回答 d 直行就到了。提問者 a b c ...
什麼是尾遞迴 尾遞迴的底層實現原理
什麼是尾遞迴 尾遞迴的底層實現原理 什麼是尾遞迴?尾遞迴就是函式最後的語句是呼叫函式自身,但呼叫自己的時候,已經 不再需要上乙個函式的環境了。所以並非所有的遞迴都屬於尾遞迴,它需要通過上述的規則來編 寫遞迴 和普通的遞迴相比,尾遞迴即使遞迴呼叫數萬次,它的函式棧也僅為常數,不會出 現stack ov...