2015-07-13 2 views
1

Итак, я пытаюсь разработать формулу, которая суммирует все нечетные числа Фибоначчи с точностью до заданного числа.Номера Фибоначчи - добавьте только нечетные числа - Javascript

Например:

  • заданное число равно 4. Затем результат должен быть 5 (нечетными номерами Фибоначчи являются 1, 1, 3).

В настоящее время это мой код:

function sumFibs(num) { 
    var sum = 0; 
    for(i=0,j=1,k=0; k<=num;i=j,j=x,k++) { 
    x = i + j; 
    if (x%2 !== 0) { 
     sum +=x; 
     if (sum >= sum) { 
     break; 
     } 
    } 
    } 
    return sum; 
} 
sumFibs(4); 

Очевидно, что код не работает. Если я удаляю оператор break (if sum> = sum), он создает бесконечный цикл. Я взял цикл for из другого сообщения здесь, где была дана формула для создания последовательности Фибоначчи, но у меня возникают трудности с тем, что делать после создания этого числа, как его добавить. Мой способ попытаться это проверить, если модуль не равен 0 (что указывает, что это нечетное число).

Благодарим за помощь.

+5

'если (сумма> = sum) {'будет * всегда * оценивать true, что пыталась сделать эта линия? – Jamiec

+0

oh wait, если бы это было 'sum> = num' - now * that * было бы больше смысла – Jamiec

+1

Удаление этого' if' вместе с 'break' [не создает] (http://jsfiddle.net/JamesThorpe/0tjh71wp /) бесконечный цикл –

ответ

6

ваш код немного запутан с именами переменных и объявлением (всегда пытайтесь объявить с помощью var). вот функция, которая получает то, что вам нужно

function sumFibs(num) { 
    var fib0 = 0; 
    var fib1 = 1; 
    var fib = 1; 
    var sum = fib0; 
    while (fib <= num){ 
    if (fib % 2) { 
     sum += fib1; 
    } 
    fib = fib0 + fib1; 
    fib1 += fib0; 
    fib0 = fib1 - fib0; 
    } 

    return sum; 
} 
2

код несколько запутался ... (что k для ?, количество элементов не имеет никакого значения в определении проблемы, также проблема переговоров о суммировании чисел Фибоначчи до определенного значения, а не до того, когда сумма пройдет мимо определенного значения).

Решение может быть

var prev_fib = 0, cur_fib = 1; 
var sum = 0; 
while(cur_fib <= num) { 
    if (cur_fib % 2 !== 0) { 
     sum += cur_fib; 
    } 

    // Move on to next Fibonacci number 
    var next_fib = cur_fib + prev_fib; 
    prev_fib = cur_fib; 
    cur_fib = next_fib; 
} 

Выбор больше имен переменных могут помочь

1

Наименьший способ сделать это.

http://jsfiddle.net/PuneetChawla/gzr68ccv/

function sum() 
{ 
    var a = 1; 
    var b = 0; 
    var c = 0; 
    var d = 4;  
    var temp = 1; 

    while(c<d-1) 
    { 
     c = a+b; 
     if(c%2 !=0){ 
     temp = temp+c; 
     } 
     b=a; 
     a=c; 
    } 
    alert(temp); 
} 
0

Вот мое решение.

function sumFibs(num) { 

    var a = 0, b = 1, f = 1, sum = 0; 
    var arr = [0, 1]; 

    while (f <= num) { 
    if (f % 2 == 1) 
     sum += f; 
    arr.push(f); 
    f = a + b; 
    a = b; 
    b = f;  
    } 

    console.log(arr); 
    return sum; 
} 
0

Я откликнулся на реакцию Неона. Это, вероятно, не так элегантно, как другие, но работает. Лучший

function sumFibs(num) { 

    var a = 0, b = 1, f = 1, sum = 0; 
    var arr = [0]; 

    while (f <= num) { 
    arr.push(f); 
    f = a + b; 
    a = b; 
    b = f;  
    } 

    var OddOnly = arr.filter(function(value, index, array){ 
     return value%2 == 1; 
    }); 

    var sumArr = oddOnly.reduce(function(a,b){ 
     return(a+b); 
    })}; 

    return sumArr; 

    } 
1

У меня есть решение, близкое к некоторым другим перечисленным, но я нашел мое, чтобы быть немного более удобным для чтения, так вот она:

function sumOddFibs(num) { 
    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; 
} 
0
function sumFibs(num) { 

    if(num === 1) 
    return 1; 

    var fib = []; 
    fib[0] =1; 
    fib[1]=1; 
    for(var i=2; i<=num;i++){ 
    fib[i]=fib[i-2]+fib[i-1]; 
    } 

    fib = fib.filter(function(val){ 
    return (val % 2 !== 0) && (val<=num); 
    }); 

    fib = fib.reduce(function(a,b){ 
    return a+b; 
    }); 

    return fib; 
} 

sumFibs(4); 
Смежные вопросы