Мы не делаем много рекурсии в моем курсе 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);
}
}
Я бы сказал, что это плохой случай для рекурсии, поскольку пользователь может вызвать переполнение стека, введя недопустимые значения. – clcto
@clcto Вероятно, это плохой случай, как вы сказали, я мало знаю о проблемах с переполнением. Но я просто использовал базовую программу, которую я уже написал, чтобы понять, как была рекурсия, поэтому она служила своей цели. Не стесняйтесь оставлять и отвечать или комментировать ссылку на более правильную реализацию рекурсии, как я уже говорил выше моего кода, мой курс на самом деле не касается рекурсии, но я хотел узнать об этом, поэтому больше информации будет оценено , Спасибо, что нашли время, чтобы посмотреть мой пост. – Evan
Правильное решение (на мой взгляд) было бы * не * использовать рекурсию. Просто цикл while, который прерывается, когда вход действителен. Когда вы вызываете функцию, она выталкивает больше информации в стек, а когда вы покидаете функцию, она удаляет эту информацию из стека. Поскольку существует некоторый максимальный размер, который может иметь стек, если вы продолжаете вызывать функцию снова и снова, не возвращаясь, не будет места для хранения необходимой информации, и вы получите исключение переполнения стека. Поскольку каждый раз, когда пользователь вводит недопустимое значение, вы снова вызываете эту функцию, вы можете получить это исключение – clcto