我正在努力的挑战:
汇总所有奇数斐波纳契数
给定正整数num,返回小于或等于num的所有奇数Fibonacci数的总和。
Fibonacci序列中的前两个数字是1和1.序列中的每个附加数字是前两个数字的总和。 Fibonacci序列的前六个数字是1,1,2,3,5和8.
例如,sumFibs(10)应该返回10,因为小于10的所有奇数Fibonacci数都是1,1,3和5.
EX:
sumFibs(1000)应返回1785。
sumFibs(4000000)应返回4613732。
sumFibs(4)应返回5.
这里有我的作品:
function sumFibs(num) {
if (num === 1) {return 1;}
var fibList = [1, 1];
for(i=2; i < num; i++){
if (fibList[i-1] + fibList[i-2] > num){
break;
}
//else if ((fibList[i-1] + fibList[i-2])%2 !== 0){
fibList.push(fibList[i-1] + fibList[i-2]);
//}
}
return fibList.reduce(function(a, b){return a+b;});
}
它给出了Fibonacci序列的总和,偶数和奇数,直到小于或等于输入数字的值。
然而,部分挑战是只加上奇数。最初,我认为这很容易,但我最大的努力都失败了。我的代码中没有工作的部分被注释掉了。任何等于4或更高的输入都会产生&#34; NaN&#34;结果。
有人可以帮忙吗?非常感谢。
答案 0 :(得分:4)
如果您只想对奇数斐波纳契数进行求和,那么您可以调整您在reduce
中使用的lambda来反映这一点。
function sumFibs(num) {
if (num === 1) {return 1;}
var fibList = [1, 1];
for(i=2; i < num; i++){
if (fibList[i-1] + fibList[i-2] > num){
break;
}
fibList.push(fibList[i-1] + fibList[i-2]);
}
return fibList.reduce(function(a, b){
return a + b%2 * b;
});
}
您评论的代码无法正常工作的原因是,为了首先计算斐波纳契数,您必须跟踪所有,而不仅仅是奇数。例如,要获得5
,您必须计算2 + 3
,只有在您首先录制2
时才能这样做。
您获得NaN
而不是其他错误号码的原因是您的循环期望fibList[i - 1]
填充实数。 i
每次迭代都会递增,但数组并不总是得到一个新元素。从某种意义上说,i
超出了数组的大小,因此加法操作数并不是实数的总和。