2017-07-04 11 views
2
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的得到異常,但如果我改變一個()來Java的斐波那契數堆棧溢出錯誤

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,我可以問爲什麼?

+2

您的循環以'j = 0'開頭,您的'fibonacci'方法的結果是什麼? – Flown

+1

瞭解'breakpoints'。然後瀏覽你的代碼,看看發生了什麼。開發人員非常重要的技能 –

回答

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(而不是進行不必要的擴展遞歸調用)時重新使用它們。

+0

我會補充說<= 0會拋出一個IllegalArgumentException .... –

1

在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)); 
} 
+0

這個答案是正確的。 –

+0

@GökhanPolat只有當你忽略'fibonacci(0)'也存在的事實。 – EJP

-1

我想你錯過了處理零。只需嘗試以下循環,

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

當您考慮Fibonacci從零開始的事實時,提供的解決方案就可以工作。 例如,當您輸入總數爲4 我提供的解決方案的輸出 - 0 1 1 2(總數4) 但是使用Robert提供的解決方案,您將獲得輸出 - 0 1 1(總計3號) – Yahini