2015-10-14 7 views
0

Привет, поэтому я пытаюсь найти сумму всех даже чисел Фибоначчи, значение которых не превышает 4 миллиона, и результат, который я получаю, продолжает возвращаться бесконечно ... Если кто-нибудь может найти ошибку в коде JS, который я написал, я 'd очень ценим обратную связь! Заранее спасибо!сумма четных чисел фибоначчи, возвращающихся бесконечность?

("problem_2_range" уже определен в моем HTML как 4000000) функции bignumber

var evenFibonacciSum = function() { 
    var sum = 0; 
    var arr = [1, 2]; 
    for (i = 2; i<=document.getElementById("problem_2_range").value; i++) { 
     var fib = arr[i-2] + arr[i-1]; 
     arr.push(fib); 
    } 
    for (i=0; i < arr.length; i++) { 
     if (arr[i] % 2 === 0) { 
      sum += arr[i]; 
     } else { 
      continue; 
     } 
    } 
    document.getElementById("answer2").innerHTML = sum; 
} 
+2

Превышено максимальное число http://stackoverflow.com/questions/21126311/javascript-factorial-prevent-infinity – epascarello

+1

Вы должны использовать длинный (64-разрядный) тип данных. Интересно, что я только что сделал эту проблему в ту ночь. –

ответ

0

Использование math.js «s

FX и заменить первую строку с

var sum = math.bignumber(0); 
0

Это зависит на то, что вы подразумеваете под «значением». Если вы имеете в виду результат функции Фибоначчи (например: 55 вы получаете с Фибоначчи (10)), то это выполнимо, конечно, потому что общая сумма не может превышать (x * (x + 1))/2 = 8 000 002 000 000 который меньше 2^53 (объект Number определяется как «двойной» IEEE-754).

Вычисление фактической функции Фибоначчи довольно дорогое, и я бы проверил величину с формулой Бине, но могу вам сказать, что результат фибоначчи (34) уже превышает 4 000 000.

Если, с другой стороны, вы хотите, чтобы n в n-м номере Фибоначчи не превышал 4 000 000, позвольте мне рассказать вам, что фибоначчи (3999999) ~ 1.0058e835950.

Это выполнимо с библиотекой быстро BigInteger (один в Math.js не очень быстро), используя трюк с матрицей экспоненциации, которая работает примерно так (в псевдокоде)

fibonacci(n){ 
    i = n -1, t = 0; 
    /* 
       | 1 0 | 
    matrix = | 0 1 | 
    */ 
    a = 1, b = 0, c = 0, d = 1; 
    while (i > 0) { 
    if(i % 0x1){ 
     t = d*(a + b) + c*b; 
     a = d*b + c*a; 
     b = t; 
    } 
    t = d*(2*c + d); 
    c = c*c + d*d; 
    d = t; 
    i >>>= 1; 
    } 
    t = a + b; 
    return t; 
} 

Это, вероятно, быстрее использовать следующий линейный алгоритм для F (п < 79)

function fb(n){ 
    var i = 1, j = 0, k, l; 
    for (k = 1; k <= n; k++) { 
    l = i + j; 
    i = j; 
    j = l; 
    } 
    return j; 
} 
Смежные вопросы