2016-04-18 3 views
1

Я работаю через это Free Code Camp exercise.Как я могу получить сумму всех нечетных значений фибоначчи в javaScript?

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

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


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

ответ

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 - это реальная сделка.

+0

Спасибо за ваше понимание-Так первые два не нужны? Я знаю, вы сказали, что последнее из трех, вероятно, вообще не нужно. Что касается Free Code Camp, в последнее время меня очень поощряют. Сначала я не мог преодолеть многие проблемы с алгоритмом, но в последнее время я был в полосе, где я проходил через них. –

+1

Первые два сегмента нуждаются в некотором редактировании логики. Насколько мне известно, третий не нужен. Вы можете реализовать логику третьего сегмента в первых двух и, возможно, заменить этот сегмент на один лайнер. Да, FCC хорош. Имейте в виду, что для начинающих это немного сложнее. Для кого-то, кто совершенно новый, я бы предложил сначала запустить [codecademy] (https://codecademy.com). – timolawl

+0

Спасибо, хорошо, я продолжу. :) Я прошел через codecademy и тому подобное (Lynda, schoolchool и т. Д.). Моя проблема была практикой. Как изучение устного языка, вы должны начать бурение во всех конструкциях, которые помогут передать ваши идеи. Так как я делаю это - на самом деле все изменилось ... –

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

Спасибо JH! Я посмотрю это утром! –

0
  1. Вы могли бы начать с определения переменных для предыдущего номера, текущий номер и общее Фибоначчи

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

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

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

    fibTotal + = currNumber;

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

    вар nextNumber = prevNumber + currNumber;

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

    prevNumber = currNumber;

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

    currNumber = nextNumber;

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

1

Heres мое решение, и я считаю, что это будет довольно читаемым:

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