2014-10-29 2 views
0

Мы не делаем много рекурсии в моем курсе java, но я хотел узнать об этом, поэтому написал небольшую тестовую программу. Проблема с программой заключается в том, что после того, как методы getLength или getWidth вызваны рекурсией, он не использует вход пользователя в операторах возврата, в результате чего область возврата displayArea равна 0.0. Если бы вы могли указать на мою ошибку и/или решение, это было бы полезно. Ниже приведен код:Java Recursion and Returns

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

+0

@clcto Вероятно, это плохой случай, как вы сказали, я мало знаю о проблемах с переполнением. Но я просто использовал базовую программу, которую я уже написал, чтобы понять, как была рекурсия, поэтому она служила своей цели. Не стесняйтесь оставлять и отвечать или комментировать ссылку на более правильную реализацию рекурсии, как я уже говорил выше моего кода, мой курс на самом деле не касается рекурсии, но я хотел узнать об этом, поэтому больше информации будет оценено , Спасибо, что нашли время, чтобы посмотреть мой пост. – Evan

+0

Правильное решение (на мой взгляд) было бы * не * использовать рекурсию. Просто цикл while, который прерывается, когда вход действителен. Когда вы вызываете функцию, она выталкивает больше информации в стек, а когда вы покидаете функцию, она удаляет эту информацию из стека. Поскольку существует некоторый максимальный размер, который может иметь стек, если вы продолжаете вызывать функцию снова и снова, не возвращаясь, не будет места для хранения необходимой информации, и вы получите исключение переполнения стека. Поскольку каждый раз, когда пользователь вводит недопустимое значение, вы снова вызываете эту функцию, вы можете получить это исключение – clcto

ответ

3

в getLength(), вы вызываете рекурсивно getLength(), но дон Не используйте результат, что означает, что 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().