什麼是尾遞迴 尾遞迴的底層實現原理

2021-08-15 06:21:49 字數 1016 閱讀 4591

什麼是尾遞迴/尾遞迴的底層實現原理

什麼是尾遞迴?尾遞迴就是函式最後的語句是呼叫函式自身,但呼叫自己的時候,已經

不再需要上乙個函式的環境了。所以並非所有的遞迴都屬於尾遞迴,它需要通過上述的規則來編

寫遞迴**。和普通的遞迴相比,尾遞迴即使遞迴呼叫數萬次,它的函式棧也僅為常數,不會出

現stack overflow異常。

遞迴和迴圈的區別?從jvm的角度來說,遞迴每增加一層,使用的棧記憶體都會增加乙個棧幀,

也就是說遞迴是以消耗記憶體為代價來換取執行速度。迴圈占用的棧幀是固定的,不會隨著迴圈次

數的增加而增加,但是執行速度會隨著迴圈次數的增加而增加。

尾遞迴的優勢?尾遞迴很好的融合了遞迴和迴圈的優點,尾遞迴既融合了遞迴速度快的優點,

又融合了迴圈占用記憶體小的特點。

尾遞迴占用的棧幀為什麼不會隨著遞迴深度的增加而增加呢?這就要搞清楚尾遞迴的實現原

理了。尾遞迴實際上是利用了電腦科學的尾呼叫,什麼是尾呼叫呢?尾呼叫指的是乙個函式最

是尾呼叫。好,回到尾遞迴上來,如果乙個函式最後乙個操作是呼叫函式本身,那麼這就是尾遞

歸。普通遞迴與尾遞迴的本質區別。尾遞迴在當前棧幀執行完之後,不需要再保留當前棧幀,而

是帶著當前棧幀的結果,進入到下一棧幀。這裡有興趣的朋友可以研究一下棧幀的生命週期。普

通的遞迴則不同了,普通的遞迴由於當前棧幀還沒有執行完,就要呼叫其他棧幀了,當前棧幀不

能退出,所以普通的遞迴占有的棧幀會隨著遞迴層次的增加而增加。這就是普通遞迴和尾遞迴的

本質區別。

尾遞迴演算法的價值。尾遞迴演算法巧妙的運用了計算機的尾呼叫,充分利用了計算機硬體的設

計原理,能夠使程式更高效的執行。但是並非所有的遞迴都可以改寫成尾遞迴,所以實際使用時

還是要具體問題具體分析。在平時的開發工作中,盡量堅持這樣乙個原則:能用尾遞迴解決的問

題,堅決不要使用普通的遞迴。

文章最後解釋一下普通遞迴和尾遞迴。尾遞迴其實是一種特殊的遞迴。本質上也是遞迴,

所以本文中的普通遞迴準確的表述應該是非尾遞迴的遞迴。

什麼是尾遞迴?

求階乘 n def fact n if n 1 return 1return n fact n 1 理論上,所有的遞迴函式都可以寫成迴圈的方式,但迴圈的邏輯不如遞迴清晰 在計算機中,函式呼叫是通過棧 stack 這種資料結構實現的,每當進入乙個函式呼叫,棧就會加一層棧幀,每當函式返回,棧就會減一層棧...

什麼是尾遞迴

遞迴演算法想必大家都已經很熟悉了。遞迴演算法雖然簡單,但是容易導致一些效能問題,於是就有了尾遞迴這種優化演算法。首先我們先看看遞迴演算法的效能問題是在 比如我們有乙個常見的演算法,叫做階乘演算法。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 ...