【发布时间】:2014-12-25 18:43:48
【问题描述】:
在我的 java 课程中我们没有做太多的递归,但我想了解它,所以我写了一个小测试程序。程序的问题是getLength或getWidth方法被递归调用后,没有使用用户在return语句中的输入,导致displayArea方法返回面积为0.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.");
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 正如你所说,这可能是一个糟糕的案例,我对溢出问题了解不多。但我只是使用我已经编写的一个基本程序来了解递归是如何被调用的,所以它达到了它的目的。随意离开并回答或评论带有更正确的递归实现的链接,正如我在上面的代码中所说,我的课程并没有真正涉及递归,但我想了解它,所以更多信息将不胜感激.感谢您花时间查看我的帖子。
-
正确的解决方案(在我看来)是不使用递归。只是一个当输入有效时中断的while循环。每当您调用一个函数时,它会将更多信息推送到堆栈中,而当您离开该函数时,它会从堆栈中删除该信息。由于堆栈可以具有一些最大大小,如果您一遍又一遍地调用函数而没有返回,将没有空间存储所需的信息,并且您会遇到堆栈溢出异常。由于每次用户输入无效值时,您都会再次调用该函数,因此您可能会得到该异常