【问题标题】:sum of even fibonacci numbers returning infinity?返回无穷大的偶数斐波那契数的总和?
【发布时间】:2016-01-13 02:31:51
【问题描述】:

嗨,所以我正在尝试找到所有值不超过 400 万的偶数斐波那契数的总和,我得到的结果一直返回无穷大......如果有人能在我写的 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;
}

【问题讨论】:

标签: javascript html arrays for-loop fibonacci


【解决方案1】:

使用math.js的bignumber函数

F.X 并将第一行替换为

var sum = math.bignumber(0);

【讨论】:

    【解决方案2】:

    这取决于您所说的“价值”。如果您指的是斐波那契函数的结果(例如:使用斐波那契(10)得到的 55),那么它当然是可行的,因为总和不能超过 (x*(x+1))/2 = 8,000,002,000,000小于 2^53(Number 对象被定义为 IEEE-754“双精度”)。

    计算实际的 Fibonacci 函数非常昂贵,我会使用 Binet 公式检查大小,但我可以告诉你 fibonacci(34) 的结果已经超过 4,000,000。

    另一方面,如果您希望第 n 个斐波那契数中的 n 不超过 4,000,000,让我告诉您 fibonacci(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

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

    【讨论】:

      猜你喜欢
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      • 1970-01-01
      • 2011-02-04
      • 1970-01-01
      相关资源
      最近更新 更多