javascript斐波那契记忆

时间:2015-11-22 23:27:11

标签: javascript recursion fibonacci

为了计算斐波纳契数列的第n项,我有熟悉的递归函数:

var fibonacci = function(index){
    if(index<=0){ return 0; }
    if(index===1){ return 1; }
    if(index===2){ return 2; }

    return fibonacci(index-2) + fibonacci(index-1);
}

这可以按预期工作。现在,我试图在一个对象中存储计算的索引:

var results = {
  0: 0,
  1: 1,
  2: 2
};

var fibonacci = function(index){
    if(index<=0){ return 0; }
    if(index===1){ return 1; }
    if(index===2){ return 2; }

    if(!results[index]){
        results[index] = fibonacci(index-2) + fibonacci(index-1);
    }
}

我知道这实际上并没有提高性能,因为我没有访问结果对象,但我想先检查我的结果对象是否在记忆之前正确填充。不幸的是,事实并非如此。对于斐波那契(9),我得到:

Object {0: 0, 1: 1, 2: 2, 3: 3, 4: NaN, 5: NaN, 6: NaN, 7: NaN, 8: NaN, 9: NaN}

为什么我为3岁以上的指数获得NaN?

5 个答案:

答案 0 :(得分:1)

递归斐波那契消耗过多的处理能力,这对应用程序不利。为了改善这一点,我们使用了记忆化。将计算结果存储在Array中。因此,接下来,当出现相同的值时,它将仅从计算得出的数组中返回存储的值。

function memoizeFabonaci(index, cache = []) {
  // console.log('index :', index, '   cache:', cache)

   if (cache[index]) {
      return cache[index] 
   }
   else {
      if (index < 3) return 1
      else {
         cache[index] = memoizeFabonaci(index - 1, cache) + memoizeFabonaci(index - 2, cache)
      }
   }
   return cache[index];

}
let a = 15
console.log('Memoize febonaci', memoizeFabonaci(a))

答案 1 :(得分:0)

通过张贴@ Juhana的评论来结束这个答案的循环:

&#34;因为当index&gt;时,你的函数不会返回任何内容。 2&#34;

答案 2 :(得分:0)

这是我的解决方案:

function fib(n, res = [0, 1, 1]) {
    if (res[n]) {
        return res[n];
    }

    res[n] = fib(n - 1, res) + fib(n - 2, res);
    return res[n];
}

console.log(fib(155));

答案 3 :(得分:0)

这是我的解决方案

使用记忆化(动态编程)(时间复杂度约为 O(n))

const results = {}

function fib(n) {
    if (n <= 1) return n

    if (n in results) {
        return results[n]
    }
    else {
        results[n] = fib(n - 2) + fib(n - 1)
    }
    return results[n]

}

console.log(fib(100))

无记忆化(时间复杂度约为 O(2^n))

function fib(n) {
    if (n <= 1) return n

    return fib(n - 1) + fib(n - 2)

}

console.log(fib(10))

答案 4 :(得分:-1)

我添加了一些补充。

var results = {};

var fibonacci = function (index) {
   if (index <= 0) return 0;

   if (index == 1 || index == 2)  return 1;

   return fibonacci(index - 2) + fibonacci(index - 1);
};

for (var i = 1; i <= 10; i++) {
  results[i] = fibonacci(i);
}

console.log(results);