2014-10-29 132 views
0

我的java課程沒有做太多的遞歸,但我想了解它,所以我寫了一個小測試程序。該程序的問題是,getLengthgetWidth方法通過遞歸調用後,它不會在返回語句中使用用戶的輸入,導致方法返回區域爲0.0。如果您能指出我的錯誤和/或解決方案,那將會有所幫助。下面是代碼:Java遞歸和返回

package recursiontest; 

import java.util.Scanner; 
public class RecursionTest 
{ 

    static void main(String[] args) { 
     // TODO code application logic here 
     double length = getLength(); 
     double width = getWidth(); 
     double area = getDimensions(length, width); 
     displayArea(area); 
    } 

    public static double getLength(){ 
     double length = 0; 
     Scanner in = new Scanner(System.in); 
     System.out.print("Please enter the rectangle's length: "); 
     if(in.hasNextDouble()){ 
      length = in.nextDouble(); 
     } 
     else{ 
      System.out.println("Input must be a double."); 
      getLength(); 
     } 
     return length; 
    } 

    public static double getWidth(){ 
     double width = 0; 
     Scanner in = new Scanner(System.in); 
     System.out.print("Please enter the rectangle's width: "); 
     if(in.hasNextDouble()){ 
      width = in.nextDouble(); 
     } 
     else{ 
      System.out.println("Input must be a double."); 
      getWidth(); 
     } 
     return width; 
    } 

    public static double getDimensions(double length, double width){ 
     double area = 0; 
     area = length * width; 
     return area; 
    } 

    public static void displayArea(double area){ 
     System.out.println("Area = "+area); 
    } 
} 
+1

我會說這是遞歸的一個不好的情況,因爲用戶可以通過輸入無效值導致堆棧溢出。 – clcto 2014-10-29 21:27:33

+0

@clcto如你所說,這可能是一個糟糕的情況,我對溢出問題了解不多。但我只是使用了一個我已經寫過的基本程序來理解遞歸是如何被調用的,所以它符合它的目的。如上所述,我可以自由地離開和回答問題,或者鏈接到一個更適當的遞歸鏈接的評論,我的代碼我的課程並不真正涉及遞歸,但我想了解它,因此將不勝感激。感謝您花時間查看我的帖子。 – Evan 2014-10-30 01:21:20

+0

適當的解決方案(在我看來)會*不*使用遞歸。僅當輸入有效時纔會中斷循環。當你調用一個函數時,它將更多的信息推送到堆棧上,當你離開函數時,它會從堆棧中刪除這些信息。由於堆棧有一定的最大尺寸,如果你一直反覆地調用該函數而沒有返回,那麼就沒有空間來存儲所需的信息,並且你會遇到堆棧溢出異常。由於每次用戶輸入無效值時,都會再次調用該函數,您可能會得到該異常 – clcto 2014-10-30 21:42:46

回答

3
getLength()

,你叫遞歸getLength(),但你不't使用結果,這意味着return length仍然返回0

替換getLength();

length = getLength(); 

(同爲寬度)

0

不要忘記新的方法分配給調用它的第一功能:

package recursiontest; 

import java.util.Scanner; 

public class RecursionTest 
{ 

static void main(String[] args) { 
    // TODO code application logic here 
    double length = getLength(); 
    double width = getWidth(); 
    double area = getDimensions(length, width); 
    displayArea(area); 
} 

public static double getLength(){ 
    double length = 0; 
    Scanner in = new Scanner(System.in); 
    System.out.print("Please enter the rectangle's length: "); 
    if(in.hasNextDouble()){ 
     length = in.nextDouble(); 
    } 
    else{ 
     System.out.println("Input must be a double."); 
     length = getLength(); 
    } 
    return length; 
} 

public static double getWidth(){ 
    double width = 0; 
    Scanner in = new Scanner(System.in); 
    System.out.print("Please enter the rectangle's width: "); 
    if(in.hasNextDouble()){ 
     width = in.nextDouble(); 
    } 
    else{ 
     System.out.println("Input must be a double."); 
     width = getWidth(); 
    } 
    return width; 
} 

public static double getDimensions(double length, double width){ 
    double area = 0; 
    area = length * width; 
    return area; 
} 

public static void displayArea(double area){ 
    System.out.println("Area = "+area); 
} 

}

0

當您getLength()方法調用本身,它扔掉的返回值。嘗試將遞歸調用更改爲:

... 
System.out.println("Input must be a double."); 
length = getLength(); 
... 

同樣適用於getWidth()。