2016-05-30 87 views
1

我需要編寫一個遞歸方法。我已經編寫了代碼來執行沒有遞歸的任務。我在練習13r.recursion(Exercise13r.java:29)處得到線程「main」java.lang.StackOverflowError中的異常。如果結果是偶數,則......如果結果爲奇數,則乘以3並減去1.顯然,我正在循環,但不知道爲什麼。任何援助將不勝感激。遞歸 - 線程「main」中的異常java.lang.StackOverflowError

if (number != 1)需要
import java.util.Scanner; 
public class Exercise13r 
{ 
    public static void main(String[] args) 
    { 
    // Initialize variables 
     long number = 0; 
     Scanner in = new Scanner(System.in); 
     System.out.println ("Enter a starting number: "); 
     number = in.nextInt(); 
     System.out.println ("Your starting number is: " + number); 
     if (number != 1) 
     { 
      recursion(number); 
     } 
    } 

    public static void recursion(long n) 
    { 
     if (n % 2 == 0) 
     { 
      recursion(n/2); 
     } 
     else 
     { 
      recursion(n*3-1); 
     } 
    System.out.println ("number: " + n); 
    return; 
    } 
} 
+0

計劃停車時數的結果= 1 – shoes

+0

你需要移動「我現在應該停止」內部'遞歸查詢'。就目前而言,'if'的兩個分支再次調用該函數,並且它永遠循環。 –

+0

在哪種情況下,你認爲你可以退出'遞歸'方法? – njzk2

回答

3

你的基本情況是函數的定義裏面,這樣它實際上知道何時停止。現在你的程序最終會減少到調用recursion(1),你的函數仍然會自動調用它(它還能做什麼?),所以它最終調用recursion(2),然後再導致recursion(1),等等。

請注意,如果在遞歸調用之前將System.out.println ("number: " + n);移到之前,這將變得明顯。既然你有無限遞歸,它永遠不會打印任何東西,防止你看到問題。

Here是一個最小的工作例如:

class Exercise13r { 
    public static void main(String[] args) { 
     recursion(12); 
    } 

    public static void recursion(long n) { 
     System.out.println ("number: " + n); 
     if (n != 1) { 
      if (n % 2 == 0) { 
       recursion(n/2); 
      } else { 
       recursion(n*3-1); 
      } 
     } 
    } 
} 

輸出:

number: 12 
number: 6 
number: 3 
number: 8 
number: 4 
number: 2 
number: 1 
+0

感謝您的提示。不幸的是,這是我原來的方式,並希望解決它。在發佈之前忘了移回去。當我把它放在裏面時,它仍然會循環。公共靜態無效遞歸(長N) \t { \t \t如果(N!= 1) \t \t { \t \t \t如果(N%2 == 0) \t \t \t { \t \t \t \t遞歸( N/2); \t \t \t} \t \t \t別的 \t \t \t { \t \t \t \t遞歸(N * 3-1); \t \t \t} \t \t System.out.println(「number:」+ n); \t \t} \t \t return; \t} – shoes

+0

請確保您先檢查基本情況,如果它是真的,則在函數返回遞歸調用之前返回該函數。也移動打印,以便您可以看到發生了什麼。如果仍然無法獲得,請使用最新的代碼編輯您的問題。 –

+0

更改了基本情況以檢查是否爲真,但仍然循環。還在每個「if」語句中添加了打印語句,但從未打印過一個打印語句。改變的代碼:public static void recursion(long n) { if(n == 1)return; (n/2 = 0) { if(n%2 == 0) 遞歸(n/2); System.out.println(「偶數:」+ n); } else { 遞歸(n * 3-1); System.out.println(「odd number:」+ n); } } – shoes

相關問題