什麼是尾遞迴?javascript 尾遞迴優化
阿新 • • 發佈:2019-01-07
尾遞迴和一般的遞迴不同在對記憶體的佔用,普通遞迴建立stack累積而後計算收縮,尾遞迴只會佔用恆量的記憶體(和迭代一樣)。
遞迴是指函式直接或間接地呼叫自己。
(普通遞迴) :
function f(x) {
if (x === 1) return 1;
return 1 + f(x-1);
}
尾遞迴的判斷標準是函式執行【最後一步】是否呼叫自身,而不是是否在函式的【最後一行】呼叫自身。
尾遞迴
function f(x) {
if (x === 1) return 1;
return f(x-1);
}
使用尾遞迴可以帶來一個好處:因為進入最後一步後不再需要參考外層函式(caller)的資訊,因此沒必要儲存外層函式的stack,遞迴需要用的stack只有目前這層函式的,因此避免了棧溢位風險。
尾遞迴優化主要是對棧記憶體空間的優化, 這個優化是O(n)到O(1)的; 至於時間的優化, 其實是由於對空間的優化導致記憶體分配的工作減少所產生的, 是一個常數優化, 不會帶來質的變化.
尾遞迴形式和迴圈(或者說”迭代”)形式大致就是同一個邏輯的兩種表達形式而已. 經過尾遞迴優化的尾遞迴程式碼和迴圈的程式碼的執行效率基本上是相當的. 這也是函數語言程式設計效率上沒有落後的一個很重要的原因.