FCC-Sum All Odd Fibonacci Number
2017-11-22 本文已影响0人
zooeydotmango
给一个正整数num,返回小于或等于num的斐波纳契奇数之和。
斐波纳契数列中的前几个数字是 1、1、2、3、5 和 8,随后的每一个数字都是前两个数字之和。
例如,sumFibs(4)应该返回 5,因为斐波纳契数列中所有小于4的奇数是 1、1、3。
提示:此题不能用递归来实现斐波纳契数列。因为当num较大时,内存会溢出,推荐用数组来实现。
博客园
issue
刚开始以为是挺简单的题目,后来仔细看了需求有点傻眼,返回小于等于num的斐波那契数且要求奇数。刚开始考虑单独写一个斐波那契数列的方法,然后while其小于num时,判断是奇数则加入和。后来看到一个更好更简洁的方法,在生成斐波那契数的同时判断是否小于num且为奇数。
var a=0,b=0,c=1,sum=0;
for(var i=0;c<=num;i++){ //当前值小于等于num加入for循环非常巧妙
sum+=(c%2==1?c:0);
a=b;
b=c;
c=a+b;
}
return sum;
}
非常巧妙,因此我想把这个方法套用到数组方法中,但是需要想一下边缘的问题。
function sumFibs(num) {
var fib=[1,1];
var sum=2;
for(var i =2;fib[i-1]<num;i++){ //fib[i]此时还没有被赋值
fib[i]=fib[i-1]+fib[i-2];
if(fib[i]>num){break;} //在加sum之前判断边界
if(fib[i]%2 !==0){sum=sum+fib[i];}
}
return sum;
}
sumFibs(1); //刚好num为1或2时返回值都是2,省去了判断
有机会想尝试测试两种方法包括最开始的想法处理速度的差别。