之前提到過尾呼叫,尾呼叫就是函式的最後一步呼叫另外一個函式。那麼遞迴就是呼叫自身,尾遞迴就是再函式的最後一步呼叫自身。?
和尾呼叫一樣,尾遞迴因為呼叫棧中只存在一個呼叫記錄,因此不會像普通遞迴那樣耗費那麼多記憶體。
以乘階函式為例
function f(n) {
if (n === 1) return 1
return n * f(n - 1)
}
複製程式碼
計算乘階函式引數為 n 那麼呼叫棧就需要儲存 n 個呼叫記錄。如果引數 n 過大直接就會導致 stack overflow
那麼就需要對遞迴進行優化,上述程式碼改寫:
function f(n, total = 1) { // ? total 引數儲存上次呼叫的結果
if (n === 1) return total
return f(n - 1, n * total) // ⚡ total 結果和 n 相乘作為引數放入到函式中
}
複製程式碼
預設大部分瀏覽器不會對尾遞迴進行優化
如果需要嘗試可以安裝 node 6.5 - 7 之間的版本測試;開啟 node 需要增加 flag
--harmony-tailcalls --use-strict