1. 程式人生 > >[Intermediate Algorithm] - Sum All Odd Fibonacci Numbers

[Intermediate Algorithm] - Sum All Odd Fibonacci Numbers

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