【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;
   }
})()
相关文章
相关标签/搜索