什麼是尾遞迴/尾遞迴的底層實現原理
什麼是尾遞迴?尾遞迴就是函式最後的語句是呼叫函式自身,但呼叫自己的時候,已經
不再需要上乙個函式的環境了。所以並非所有的遞迴都屬於尾遞迴,它需要通過上述的規則來編
寫遞迴**。和普通的遞迴相比,尾遞迴即使遞迴呼叫數萬次,它的函式棧也僅為常數,不會出
現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 ...