?30 秒瞭解尾遞迴和尾遞迴優化

JS菌發表於2019-03-18

20190318085839.png

之前提到過尾呼叫,尾呼叫就是函式的最後一步呼叫另外一個函式。那麼遞迴就是呼叫自身,尾遞迴就是再函式的最後一步呼叫自身。?

和尾呼叫一樣,尾遞迴因為呼叫棧中只存在一個呼叫記錄,因此不會像普通遞迴那樣耗費那麼多記憶體。

以乘階函式為例

function f(n) {
    if (n === 1) return 1
    return n * f(n - 1)
}
複製程式碼

計算乘階函式引數為 n 那麼呼叫棧就需要儲存 n 個呼叫記錄。如果引數 n 過大直接就會導致 stack overflow

20190318095020.png

那麼就需要對遞迴進行優化,上述程式碼改寫:

function f(n, total = 1) { // ? total 引數儲存上次呼叫的結果
    if (n === 1) return total
    return f(n - 1, n * total) // ⚡ total 結果和 n 相乘作為引數放入到函式中
}
複製程式碼

20190318095103.png

預設大部分瀏覽器不會對尾遞迴進行優化

20190318094451.png

如果需要嘗試可以安裝 node 6.5 - 7 之間的版本測試;開啟 node 需要增加 flag --harmony-tailcalls --use-strict

?30 秒瞭解尾遞迴和尾遞迴優化

相關文章