FCC-Sum All Odd Fibonacci Numbers

給一個正整數(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,省去了判斷

有機會想嘗試測試兩種方法包括最開始的想法處理速度的差別。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容