甚至斐波那契数字返回无穷大的总和?

时间:2015-10-14 20:22:33

标签: javascript html arrays for-loop fibonacci

嗨所以我试图找到所有偶数Fibonacci数的总和,其值不超过4百万,结果我得到的不断返回无穷大......如果有人能在JS代码中找到错误我写的我非常感谢您的反馈!提前谢谢!

(“problem_2_range”已在我的HTML中定义为4000000)

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 个答案:

答案 0 :(得分:0)

使用math.js的bignumber功能

F.X并用

替换第一行
var sum = math.bignumber(0);

答案 1 :(得分:0)

这取决于你的“价值”是什么意思。如果你的意思是Fibonacci函数的结果(例如:你用Fibonacci得到的55(10))那么它是可行的,当然,因为总和不能超过(x *(x + 1))/ 2 = 8,000,002,000,000小于2 ^ 53(Number对象被定义为IEEE-754“double”)。

计算实际的Fibonacci函数是非常昂贵的,我会用Binet公式检查幅度,但我可以告诉你,斐波那契(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(n <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;
}