为什么我会收到Stackoverflow错误?

时间:2016-01-06 07:53:09

标签: java algorithm recursion

我有一个小的递归算法,应该猜一个数字。我调用方法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

1 个答案:

答案 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);
    }
}