[英]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.