寫在之前
關於斐波那契數列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 ...