Как я могу получить сумму всех нечетных значений Фибоначчи в javaScript?

Я работаю над этим упражнением Free Code Camp.

Возвращает сумму всех нечетных чисел Фибоначчи, включая переданное число, включая число Фибоначчи. Первые несколько чисел последовательности Фибоначчи - 1, 1, 2, 3, 5 и 8, и каждое последующее число является суммой двух предыдущих чисел.

И вот что у меня так далеко...

Какие-либо предложения?

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;
}

Все, что я вернусь, это undefined что кажется странным, потому что я думал, что эта часть моего кода была довольно крутой - использование значений функций для сравнения с оператором if.

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


    if (isFibVal && !isEvenVal){
        sum  += sumArray(arr);  
}

4 ответа

Вот мое решение, и я нахожу его довольно читабельным:

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;
}

Я не буду давать вам ответ прямо, так как вы проходите через 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 - это реальная сделка.

Вы довольно близки, и другой ответ хорош для того, чтобы подтолкнуть вас в правильном направлении, я опубликую другой способ, который делает это с помощью нативных функций JS:

Пример кода ниже в 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;
}
  1. Вы можете начать с определения переменных для предыдущего числа, текущего числа и общего числа Фибоначчи

  2. Чтобы проверить нечетные числа, вы можете использовать оператор if и использовать%:

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

  3. Если текущее число нечетное, то вы добавляете его к общему количеству

    fibTotal += currNumber;

  4. Чтобы определить следующий номер Фибоначчи, вам нужно будет добавить предыдущий и текущий номер:

    var nextNumber = prevNumber + currNumber;

  5. Вам нужно будет обновить предыдущий номер до текущего

    prevNumber = currNumber;

  6. Установить текущее число на следующее число Фибоначчи в последовательности

    currNumber = nextNumber;

Надеюсь это поможет.

Другие вопросы по тегам