給一個(gè)正整數(shù)num先誉,返回小于或等于num的斐波納契奇數(shù)之和。
斐波納契數(shù)列中的前幾個(gè)數(shù)字是 1的烁、1褐耳、2、3渴庆、5 和 8铃芦,隨后的每一個(gè)數(shù)字都是前兩個(gè)數(shù)字之和雅镊。
例如,sumFibs(4)應(yīng)該返回 5刃滓,因?yàn)殪巢{契數(shù)列中所有小于4的奇數(shù)是 1仁烹、1、3咧虎。
提示:此題不能用遞歸來實(shí)現(xiàn)斐波納契數(shù)列卓缰。因?yàn)楫?dāng)num較大時(shí),內(nèi)存會(huì)溢出砰诵,推薦用數(shù)組來實(shí)現(xiàn)征唬。
博客園
issue
剛開始以為是挺簡單的題目,后來仔細(xì)看了需求有點(diǎn)傻眼茁彭,返回小于等于num的斐波那契數(shù)且要求奇數(shù)总寒。剛開始考慮單獨(dú)寫一個(gè)斐波那契數(shù)列的方法,然后while其小于num時(shí)理肺,判斷是奇數(shù)則加入和偿乖。后來看到一個(gè)更好更簡潔的方法,在生成斐波那契數(shù)的同時(shí)判斷是否小于num且為奇數(shù)哲嘲。
var a=0,b=0,c=1,sum=0;
for(var i=0;c<=num;i++){ //當(dāng)前值小于等于num加入for循環(huán)非常巧妙
sum+=(c%2==1?c:0);
a=b;
b=c;
c=a+b;
}
return sum;
}
非常巧妙贪薪,因此我想把這個(gè)方法套用到數(shù)組方法中,但是需要想一下邊緣的問題眠副。
function sumFibs(num) {
var fib=[1,1];
var sum=2;
for(var i =2;fib[i-1]<num;i++){ //fib[i]此時(shí)還沒有被賦值
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時(shí)返回值都是2画切,省去了判斷
有機(jī)會(huì)想嘗試測試兩種方法包括最開始的想法處理速度的差別。