我正在努力的挑战:
和所有奇数斐波那契数
给定一个正整数num,返回小于等于num的所有奇数Fibonacci数的和。
斐波那契数列的前两个数是1和1。数列中每增加一个数都是前两个数的和。斐波那契数列的前六个数字分别是1、1、2、3、5和8。
例如,sumFibs(10)应该返回10,因为所有小于10的斐波那契奇数都是1,1,3和5。
,
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;});
}
它给出了斐波那契数列的和,包括偶数和奇数,直到小于或等于输入的数字。
然而,挑战的一部分是只把奇数加起来。起初,我以为这很容易,但我最大的努力都失败了。我的代码中不能工作的部分被注释掉了。任何等于或大于等于4的输入结果为"NaN"。
有人能帮忙吗?非常感谢。
如果你只想求和奇数斐波那契数,那么你可以调整你在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
每次迭代都加1,但数组并不总是得到一个新元素。在某种意义上,i
超出了数组的大小,所以加法操作数不是实数的和。