Java斐波那契堆栈溢出错误

Java fibonacci stack overflow error

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.WhosebugError 中出现异常但是如果我将 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,请问为什么?

您不处理 num == 0 的情况,因此当您调用 fibonacci(0) 时,递归永远不会结束,导致堆栈已满时 WhosebugError

你可以通过改变循环的范围来解决它

 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) 的中间结果并在为 n > i 计算 fibonacci(n) 时重新使用它们会更有效率(而不是进行不必要的扩展递归调用)。

在 for 语句中,您从 0 开始。这是 fibonacci-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));
 }

我想你没有处理零。只需尝试以下循环,

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