[英]Why do I get a Stackoverflow Error?
我有一个递归算法,应该猜一个数字。 我调用方法guessNumber,并给出一个数字和一个比该数字低的值,以及一个比数字高的值。 如果该值高于数字区域的中间值,则对新的数字区域进行相同的处理。 但是它的值越小,数字面积越小。 如果所有这些情况都不成立,则返回最大值(可能是最小值,因为此时它们是相同的)。 但是为什么要给出一个StackOverflowError? 我不明白为什么程序无法结束。 任何帮助将不胜感激。 谢谢。
public class Starter {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Starter s = new Starter();
System.out.println(s.guessNumber(18, 1, 100));
}
public int guessNumber(int num, int min, int max) {
int middle = (max - (min - 1)) / 2;
if (num > middle) {
guessNumber(num, middle + 1, max);
} else if (num < middle) {
guessNumber(num, min, middle);
}
return max;
}
}
现在,此代码不再出现错误:
public int guessNumber(int num, int min, int max) {
int middle = (max + min) / 2;
if (num > middle) {
return guessNumber(num, middle + 1, max);
} else if (num < middle) {
return guessNumber(num, min, middle);
}
return max;
}
但是这个数字不正确。 如果我用这种方式来guessNumber(18, 1, 100)
话guessNumber(18, 1, 100)
的预期输出应该是18
但我得到19
。 如果我这样称呼guessNumber(34, 1, 100)
则输出为37
首先,您忘记了返回递归调用的值。
其次,您对middle
位数的计算是错误的。 例如,如果min
为10且max
为20,则您的计算会将5分配给middle
,而不是15。
public int guessNumber(int num, int min, int max) {
if (min == max) {
return min;
}
int middle = (max + min) / 2;
if (num > middle) {
return guessNumber(num, middle + 1, max);
} else {
return guessNumber(num, min, middle);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.