給一個正整數(shù)num,返回小于或等于num的斐波納契奇數(shù)之和。
斐波納契數(shù)列中的前幾個數(shù)字是 1、1、2、3、5 和 8,隨后的每一個數(shù)字都是前兩個數(shù)字之和。
例如,sumFibs(4)應(yīng)該返回 5,因為斐波納契數(shù)列中所有小于4的奇數(shù)是 1、1、3。
提示:此題不能用遞歸來實現(xiàn)斐波納契數(shù)列。因為當num較大時,內(nèi)存會溢出,推薦用數(shù)組來實現(xiàn)。
博客園
issue
剛開始以為是挺簡單的題目,后來仔細看了需求有點傻眼,返回小于等于num的斐波那契數(shù)且要求奇數(shù)。剛開始考慮單獨寫一個斐波那契數(shù)列的方法,然后while其小于num時,判斷是奇數(shù)則加入和。后來看到一個更好更簡潔的方法,在生成斐波那契數(shù)的同時判斷是否小于num且為奇數(shù)。
var a=0,b=0,c=1,sum=0;
for(var i=0;c<=num;i++){ //當前值小于等于num加入for循環(huán)非常巧妙
sum+=(c%2==1?c:0);
a=b;
b=c;
c=a+b;
}
return sum;
}
非常巧妙,因此我想把這個方法套用到數(shù)組方法中,但是需要想一下邊緣的問題。
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,省去了判斷
有機會想嘗試測試兩種方法包括最開始的想法處理速度的差別。