[Intermediate Algorithm] - Sum All Odd Fibonacci Numbers
阿新 • • 發佈:2017-05-25
org nac mil 數列 個數字 code target reference ava
題目
給一個正整數num,返回小於或等於num的斐波納契奇數之和。
斐波納契數列中的前幾個數字是 1、1、2、3、5 和 8,隨後的每一個數字都是前兩個數字之和。
例如,sumFibs(4)
應該返回 5,因為斐波納契數列中所有小於4的奇數是 1、1、3。
提示
此題不能用遞歸來實現斐波納契數列。因為當num較大時,內存會溢出,推薦用數組來實現。
參考文檔:博客園,Issue
Remainder
測試用例
sumFibs(1)
應該返回一個數字。sumFibs(1000)
應該返回1785
。sumFibs(4000000)
應該返回4613732
。sumFibs(4)
應該返回5
。sumFibs(75024)
60696
。sumFibs(75025)
應該返回135721
。
分析思路
斐波那契數第一個和第二個為 1 是固定的,所以初始數組可以設置為: var fibsArray = [1, 1];
然後根據最後一個數等於前兩數之和設置下一個數組元素,這樣就組成了需要的斐波那契數組。對於奇數直接計算提出就行。
代碼
1.function sumFibs(num) { 2. var fibsArray = [1, 1]; 3. var retVal = 1; 4. 5. while (fibsArray[fibsArray.length - 1] <= num) {6. if (fibsArray[fibsArray.length - 1] % 2) { 7. retVal += fibsArray[fibsArray.length - 1]; 8. } 9. fibsArray.push(fibsArray[fibsArray.length - 2] + fibsArray[fibsArray.length - 1]); 10. } 11. fibsArray.pop(); /* 去除最後一個大於 num 的數 */ 12. 13. return retVal; 14.} 15. 16.sumFibs(4);
另一個不用到數組的方法,該方法主要是針對該題的
1.function sumFibs(num) { 2. var fibo = [1, 1]; 3. var oddSum = 2; 4. 5. while(true){ 6. var item = fibo[0] + fibo[1]; 7. if(num < item){ 8. return oddSum; 9. } 10. if(item % 2){ 11. oddSum += item; 12. } 13. fibo[0] = fibo[1]; 14. fibo[1] = item; 15. } 16.} 17. 18.sumFibs(4);
[Intermediate Algorithm] - Sum All Odd Fibonacci Numbers