Java fibonacci堆栈溢出错误

时间:2017-07-04 11:03:50

标签: java stack-overflow

public static void main(String[] args) {
    one();
    System.out.println();
}

public static void one() {
  Scanner sc = new Scanner(System.in);
  System.out.println("Enter a number:");
  int i = sc.nextInt();

  for (int j=0; j<i; j++) {
      System.out.println(fibonacci(j));
  }
}

public static int fibonacci(int num){
    if (num == 1) {
        return 0;
    }
    else if (num == 2 || num == 3){
        return 1;
    }
    else {
        return fibonacci(num-1) + fibonacci(num-2);
    }
}

当我运行时,会在线程“main” java.lang.StackOverflowError 中获得Exception但是如果我将one()更改为

public static void one() {
  Scanner sc = new Scanner(System.in);
  System.out.println("Enter a number:");
  int i = sc.nextInt();
  System.out.println(fibonacci(j));
}

我不会得到错误,即使我输入1,我可以问为什么?

3 个答案:

答案 0 :(得分:3)

你没有处理num == 0的情况,所以当你调用fibonacci(0)时,递归永远不会结束,当堆栈已满时会导致StackOverflowError

您可以通过更改循环范围来解决此问题

 for (int j=1; j<i; j++) {
     System.out.println(fibonacci(j));
 }

或通过更改递归方法的停止条件:

public static int fibonacci(int num) {
    if (num <= 1) {
        return 0;
    }
    else if (num == 2 || num == 3){
        return 1;
    }
    else {
        return fibonacci(num-1) + fibonacci(num-2);
    }
}

也就是说,存储fibonacci(i)的中间结果会更有效,并在为fibonacci(n)计算n > i时重复使用它们(而不是进行不必要的扩展递归调用)。

答案 1 :(得分:1)

在for-Statement中,你从0开始。这是斐波那契 - Funktion的第一个输入。尝试:

public static void one() {
Scanner sc = new Scanner(System.in);
System.out.println("Enter a number:");
 int i = sc.nextInt();

 for (int j=1; j<i; j++) {
     System.out.println(fibonacci(j));
 }

答案 2 :(得分:-1)

我认为你错过了处理零。只需尝试以下循环,

   for (int j=1; j<=i; j++) {
    System.out.println(fibonacci(j));
    }