我需要总结所有奇怪的斐波那契数字,但仅适用于某些数字

时间:2017-01-31 21:50:04

标签: javascript

任务:给定正整数num,返回小于或等于num的所有奇数Fibonacci数的总和。

Fibonacci序列中的前两个数字是1和1.序列中的每个附加数字是前两个数字的总和。 Fibonacci序列的前六个数字是1,1,2,3,5和8.

例如,sumFibs(10)应该返回10,因为小于10的所有奇数Fibonacci数都是1,1,3和5.

这是在freecodecamp上。我看过我知道我可以轻松复制它们的例子,但是我想编写自己的代码,有人可以解释为什么我会得到这些results以及我哪里出错了?感谢。

function sumFibs(num) {
  var arr = [0, 1, 1]; //array of fibonacci numbers
  var fin = 0; //variable for final number
  for(var i = 3;i < 35;i++)
    {
      arr[i] = arr[i-1] + arr[i-2];
    }
  // loop to make fibonacci numbers
  for(var x = 0; x < arr.length-1; x++)
    {
        if(arr[x] <= num  && (arr[x] % 2 === 0))
          {
          fin += arr[x];
          }//if to check if array of fibonacci numbers[x] is less than num && if it is odd
    }//loop to go through every fibonacci number
  return fin;
}
sumFibs(1000);

3 个答案:

答案 0 :(得分:2)

当您进行模运算时:

    if(arr[x] <= num  && (arr[x] % 2 === 0))

你问两件事:

  1. 如果arr [x]值小于数字(检查)
  2. 如果arr [x]值是偶数,则不是奇数。
  3. 这就是您的问题发生的地方。

    相反,你应该使用:

        if(arr[x] <= num  && (arr[x] % 2 != 0))
    

答案 1 :(得分:1)

这是我的解决方案:

function sumFibs(num) 
{
    var prev=0,curr=1,result=0,added;
     while(curr<=num)
     {
         if(curr % 2 !=0)
         {
         result+=curr;
         }
         added= curr+prev;
         prev=curr;
         curr=added;
     }
    return result;
}
sumFibs(4);

答案 2 :(得分:1)

尝试一下

function sumFibs(num) {
  var firstNum = 0;
  var secondNum = 1;
  var sequence = [];
  var index = [];
  while (firstNum <= num) {
    sequence.push(firstNum, secondNum);
    firstNum = firstNum + secondNum;
    secondNum = firstNum + secondNum;
    /**/

    }
  for (var key in sequence) {
  if (sequence[key] <= num) {
    index.push(sequence[key]);
  }}  
  //return index;
  var oddIndex = [];
  for (var key in index) {
    if (index[key] % 2 !== 0) {
      oddIndex.push(index[key]);
    }
  }
  // return oddIndex;
  var output = oddIndex.reduce(function(a,b){
    return a+b;
  });
  return output;
}

sumFibs(75025); //should return 135721