计算用Java实现的Fibonacci序列的算法给出了奇怪的结果

use*_*976 2 java iteration recursion fibonacci

当我运行Countdown.class时,我得到以下输出:

263845041
-1236909152
-973064111
2084994033
1111929922
-1098043341
13886581
-1084156760
-1070270179
2140540357
Run Code Online (Sandbox Code Playgroud)

发射!

"爆炸之前"的数字!应该是前10个斐波那契数字.我的源代码如下.

    public class Fibonacci {

  public static long fib(int n) {
    if (n <= 1) return 1;
    return fib(n-1) + fib(n-2);
  }

  public static long fastfib(int n) {
    int a = 0;
    int b = 1;
    int c = 0;

    for (int i = 0; i <= n; n++) {
      c = a + b;
      a = b;
      b = c;    
    }

    return c;
  }

}
Run Code Online (Sandbox Code Playgroud)

并且实现fastfib方法的类是:

public class Countdown {

  public static void countdown(int n) {
    if (n == 0) System.out.println("Blast Off!");
    else {
      System.out.println(Fibonacci.fastfib(n));
      countdown(n - 1); 
    }
  }

  public static void main(String[] args) {
    countdown(10);
  }
}
Run Code Online (Sandbox Code Playgroud)

ami*_*mit 12

虽然您的fastfib()方法返回long,但计算是在ints 上完成的.

您遇到整数溢出.

确保声明a,b,clongs而不是ints.如果你想要更大的数字(也超出longs 的范围) - 你可能想看看BigInteger(并使用它).


编辑:正如@ExtremeCoders在评论中所提到的,你的for循环代码中还有另一个问题:
for (int i = 0; i <= n; n++)应该是for (int i = 0; i <= n; i++),你想增加i- 不是n.

  • **这个程序的主要问题不是"整数溢出"而是行`for(int i = 0; i <= n; n ++)` - 它应该是`for(int i = 0; i <= n;我++)`** (8认同)