我有一个小的递归算法,应该猜一个数字。我调用方法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)
,预期输出应为18
,但我得到19
。如果我这样称呼guessNumber(34, 1, 100)
,那么输出就是37
答案 0 :(得分:2)
首先,您忘记返回递归调用的值。
其次,您对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);
}
}