使用ES6尾呼叫優化遞迴實現

2021-09-13 20:52:02 字數 1136 閱讀 5508

寫在之前

關於斐波那契數列1 1 2 3 5 8 13 21 ......,求指定位置的值

一道經常遇到的面試題,相信大部分人都知道如何實現

function fibonacci(n)

return fibonacci(n-1) + fibonacci(n-2);

}​console.log(fibonacci(20));

上面就是我面試也給出的答案,看起來確實沒問題,也能給出計算正確答案,當面試官問我能不能再優化時,我給出了否定答案(真是汗顏),不過在了解了es6中尾呼叫之後,好像確實可以優化一下。

何為尾呼叫優化 《深入理解es6》一書中給出如下解釋:

ecmascript 6縮減了嚴格模式下尾呼叫棧的大小(非嚴格模式下不受影響),如果滿足一下條件,尾呼叫不再建立新的棧幀,而是清除並重用當前棧幀::

基於上面三個條件,給出如下實現方式 :

function fibonacci(n, a=0, b=1)

return fibonacci(n - 1 , b, ret);

}console.log(fibonacci(20));

或者更簡便寫法

function fibonacci(n, a=0, b=1)
兩者的區別之處在於return時前者呼叫結果參與了計算,後者直接返回函式呼叫結果;

測試兩者耗時對比:

從結果看 當n值較小時兩者幾乎沒什麼差別,當n值越大,兩者的差別就顯現出來了。

以上是對尾呼叫的一些總結,如有不正確之處,還望指出加以改正。

尾呼叫尾遞迴及其優化(筆記)

尾呼叫 尾呼叫 tail call 是函式式程式設計的乙個重要概念,本身非常簡單,即指某個函式的最後一步呼叫另乙個函式。function f x 上述 中,函式的最後一步是呼叫函式g,這就叫尾呼叫。以下三種情況,都不屬於尾呼叫。function f x function f x function f...

ES6 函式優化

在es6以前,我們無法給乙個函式引數設定預設值,只能採用變通寫法 function add a b 傳乙個引數 console.log add 10 現在可以這麼寫 function add a b 1 傳乙個引數 console.log add 10 es6中定義函式的簡寫方式 乙個引數時 var...

es函式之尾呼叫優化

什麼是尾呼叫優化?尾呼叫是函式式程式設計的乙個重要概念,本身非常簡單,一句話就能說清楚,就是指某個函式的最後一步是呼叫另乙個函式。function f x 上面 中,函式f的最後一步是呼叫函式g,這就叫尾呼叫。以下三種情況,都不屬於尾呼叫。情況一 function f x 情況二 function ...