我正在研究下面的斐波那契数字问题:
给出一个正整数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));
答案 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];
}
此外,您可以存储已经计算出的斐波那契数,以避免巨大的重新计算负担,并节省内存和时间。