【问题标题】:Fibonacci Iteration : To find the nth term of the Fibonacci sequence for n > 50 [duplicate]斐波那契迭代:找到 n > 50 的斐波那契数列的第 n 项
【发布时间】:2017-06-18 11:07:19
【问题描述】:

此代码在 n = 46 后没有返回正确答案。我可以做些什么来解决这个问题以获得更高的第 n 项?

 public static long fibonacciIterative(long n) 
    {
      if(n <= 1) {
    return n;
           }
        int x = 1;
        int y = 1;
        for(int i=2; i<n; i++) 
           {
            int z = x;
            x+= y;
            y = z;
            }
        return x;
}

感谢大家的积极反馈。在提出问题后,我一跑下代码就想通了。

【问题讨论】:

  • 首先将xyz 更改为long
  • 提示:你认为int 可以代表的最大数量是多少?您认为斐波那契数字超过 46 有多大?
  • int 保存从 -2^312^31-1 的数字,因为 int 在爪哇。任何斐波那契数 n>46 项都超过了这些限制。您可以使用long,它是 64 位并保存更大的数字。 BigInteger 持有更大,如果您需要超过 long 的限制。
  • @Henry True 感谢您指出这一点。

标签: java iteration fibonacci


【解决方案1】:

这很可能是因为整数溢出。对变量xyz 使用long

这会让你更进一步,但最终也会溢出long 范围。如果您需要更大的数字,请联系BigInteger

【讨论】:

    【解决方案2】:

    复杂度为O(1) 的最佳方法是Binet 公式,在Java 中如下:

     static long fibonacciBinet(long n) {
        if (n <= 1) return n;
        double sqrt5 = Math.sqrt(5);
        long x = (long) ((Math.pow(1+sqrt5, n)-Math.pow(1-sqrt5, n))/(Math.pow(2, n)*sqrt5));
    
        return x;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-09-03
      • 2014-02-22
      • 2022-12-10
      • 1970-01-01
      • 2017-01-29
      • 2012-10-12
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多