如何在javaScript中获得所有奇怪的fibonacci值的总和?

时间:2016-04-18 22:52:20

标签: javascript fibonacci

我正在研究Free Code Camp exercise

  

返回所有奇数斐波纳契数的总和,包括   如果它是斐波纳契数,则传递数字。 Fibonacci序列的前几个数字是1,1,2,3,5和   8,每个后续数字是前两个数字的总和。

这就是我到目前为止所拥有的......

有什么建议吗?

True

所有我回来的都是function sumFibs(num) { var arr, isFibVal, isEvenVal, sum, i = 0, fibonacci = function (num){ var a, b, result, fibArr = [1]; a=0; b=1; result=b; for(var j = 0; j < num; j++){ result = a + b; a = b; b = result; fibArr.push(result); } return fibArr; }, isFib = function (val){ var prev = 0; var curr = 1; while(prev<=val){ if(prev == val){ return true; } else { return false; } curr = prev + curr; prev = curr - prev; } }, isEven = function(someNumber){ return (someNumber % 2 === 0) ? true : false; }; function sumArray(array) { for ( var index = 0, // The iterator length = array.length, // Cache the array length sum = 0; // The total amount index < length; // The "for"-loop condition sum += array[index++] // Add number on each iteration ); return sum; } arr = fibonacci(num); isFibVal = isFib(num); isEvenVal = isEven(num); if (isFibVal && !isEvenVal){ sum += sumArray(arr); } return sum; } ,这似乎很奇怪,因为我认为我的代码中的这一部分非常酷 - 使用函数值来检查if语句。

undefined

4 个答案:

答案 0 :(得分:1)

由于您正在通过FCC,我不会直接给您答案,但我会向您提供一些关于在哪里寻找的提示:

请参阅此细分:

for(var j = 0; j < num; j++){
    result = a + b;
    a = b;
    b = result;
    fibArr.push(result);
}

这一个:

function sumArray(array) {
  for (
    var
      index = 0,              // The iterator
      length = array.length,  // Cache the array length
      sum = 0;                // The total amount
      index < length;         // The "for"-loop condition
      sum += array[index++]   // Add number on each iteration
  );
  return sum;
}

此外,您可能根本不需要此细分:

isFibVal = isFib(num);
  isEvenVal = isEven(num);


if (isFibVal && !isEvenVal){
    sum  += sumArray(arr);  
祝你好运。作为完成了大量课程的人,我可以说Free Code Camp是真正的交易。

答案 1 :(得分:1)

你非常接近,另一个答案很适合推动你朝着正确的方向发展,我将发布一种使用原生JS功能的不同方式:

Example of the code below in JSBin

function fibs(n) {
  var f = [0, 1];
  var extraNumber = 0;
  for (var i = 0; i < n; i++) {
    f.push(f[f.length - 1] + f[f.length - 2]);
  }
  // lets check if the passed in number is a fib:
  if (f.indexOf(n) > -1) {
    extraNumber = n;
  }
  console.log(f); // just to check we can cut all the logs later...

  var filtered = f.filter(function(num) {
    // filter out the even numbers
    return num % 2 === 1;
  });
  console.log(filtered);

  var sum = filtered.reduce(function(a, b) {
    // add up whats left
    return a + b;
  });
  console.log(sum);
  return sum + extraNumber;
}

答案 2 :(得分:1)

继承我的解决方案,我发现它非常易读:

function sumOddFibs(num) {
  // initialize with 2 because 
  // fib sequence starts with 1 and 1
  var sum = 2;

  var prev = 1;
  var curr = 1;
  var next = 2;

  while (next <= num) {
    prev = curr;
    curr = next;
    next = prev + curr;

    if (curr % 2 !== 0) {
      sum += curr;
    }
  }
  return sum;
}

答案 3 :(得分:0)

  1. 您可以先为前一个数字,当前数字和总斐波那契定义变量

  2. 要检查奇数,可以使用if语句并使用%:

    if(currNum%2!== 0){}

  3. 如果当前数字为奇数,则将其添加到总数

    fibTotal + = currNumber;

  4. 要确定您的下一个斐波那契数字,您需要添加上一个和当前数字:

    var nextNumber = prevNumber + currNumber;

  5. 您需要将之前的号码更新为当前号码

    prevNumber = currNumber;

  6. 将当前数字设置为序列

    中的下一个斐波纳契数

    currNumber = nextNumber;

  7. 希望这有帮助。