簡體   English   中英

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

當我運行時,這將在線程“主” java.lang.StackOverflowError中獲得異常,但是如果我將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) ,遞歸永遠不會結束,從而在堆棧已滿時導致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)的中間結果並在為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));
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM