【JS 小短文】變態版斐波那契

轉載自 個人博客 面試

效率呢?

斐波那契數列你們應該再熟悉不過了,平時面試也常常會被問到,然而不知道你們有沒有考慮過它的效率呢?緩存

普通版

咱們通常給出的代碼應該是這樣的:閉包

function fibonacci(n) {
    if(n==0 || n == 1)
        return n;
    return fibonacci(n-1) + fibonacci(n-2);
}

這段代碼邏輯徹底沒問題,可是若是你稍測試一下可能就會發現問題了,好比能夠試一下 fibonacci(70),這時你可能吃個飯回來它還沒執行完。測試

變態版

之因此叫它「變態版」,是由於在fibonacci(1000)如下基本能夠在 5 毫秒以內完成,效率提高了 Infinity 倍,然而爲何差距這麼大?咱們先看個圖:優化

alt

這是n = 5的時候的計算過程,顯而易見,它包含了不少次重複的計算,優化它也很簡單,咱們只須要加個緩存(這裏用到了閉包),代碼以下:spa

var fibonacci = (function() {
  // 這裏我用了 Map,用普通對象也是能夠的
  var cache = new Map();
   return function(n){
       if(n == 0 || n == 1){
       cache.set(n,n);
       return n;
      }
      var v1 = cache.get(n-1) ? cache.get(n-1):fibonacci(n-1);
      var v2 = cache.get(n-2) ? cache.get(n-2):fibonacci(n-2);
      var nVal = v1 + v2;
      cache.set(n, nVal);
      return nVal;
   }
})()
相關文章
相關標籤/搜索