js:斐波那契数算法中给定的整数更大时得到错误的答案

时间:2018-08-04 17:16:29

标签: javascript algorithm sum fibonacci

我正在研究下面的斐波那契数字问题:

  

给出一个正整数num,返回所有奇数斐波那契的和   小于或等于num的数字。例如,sumFibs(10)   应该返回10,因为所有奇数斐波那契数均小于或等于   到10分别是1、1、3和5。

sumFibs(1) should return a number.
sumFibs(1000) should return 1785.
sumFibs(4000000) should return 4613732.
sumFibs(4) should return 5.
sumFibs(75024) should return 60696.
sumFibs(75025) should return 135721.

以下是我的解决方案。我感到困惑,为什么当给定的整数num等于4000000时我得到的总和错误,但是其他输出都很好。谢谢。

function FindFib(num){   
    if(num === 0)
       return 0;    
    else if(num === 1)
       return 1;    
    else
       return FindFib(num-2) + FindFib(num-1); 
}

function sumFibs(num) {    
  var total=0;   
  var fib=0;

  for(var i =0;i<=num;i++){

    fib = FindFib(i);

    if(fib%2 === 1 && fib <= num)
      total=total+fib;         
   }
     return total;    
}

console.log(sumFibs(400000));

1 个答案:

答案 0 :(得分:1)

FindFib方法将不起作用,因为斐波那契数很快就会变大。

请注意,如果第n个斐波纳契数大于X,则n + 1个斐波那契数也大于X。因此,我们可以在找到第一个超过N的斐波那契数时停止。

因此我们可以将sumFibs方法重写为

function sumFibs(num) {    
  var total=0;   
  var fib=0;
  for(var i = 0;i <= num; i++){
    fib = FindFib(i);
    if(fib > num)break;
    if(fib%2 === 1)
      total=total+fib;         
   }
   return total;    
}

您还可以通过简单的迭代方法找到第n个斐波那契数,

function findFib(n) {
    let fib = [];
    fib[0] = 1
    fib[1] = 1
    for(int i = 2; i <= n; ++i) {
        fib[i] = fib[i-1]+fib[i-2];
    }
    return fib[n];
}

此外,您可以存储已经计算出的斐波那契数,以避免巨大的重新计算负担,并节省内存和时间。