java复杂的if语句导致StackOverflowError

时间:2018-09-16 18:02:34

标签: java recursion stack-overflow

我提出了一种递归方法,以找到一支或另一支球队获胜之前在给定积分下应该能赢得的最小集会数量-k,两队的当前得分-x和y。

看起来像

public static int scores(int k, int x, int y, int rally) {
    if (x==k || y==k)
        return rally;
    else {
        rally++;
        return Math.min(scores(k, x + 1, y, rally), scores(k, x,y+1,rally));
    }
}

当我在main方法中使用自定义值调用此方法

scores(5,0,0,0)

效果很好。但是,当我更改IF语句以检查获胜者至少具有两点优势

if ((x==k || y==k) && Math.abs(x-y)>=2)

程序显示java.lang.StackOverflowError

我对此很不好,请帮助我

1 个答案:

答案 0 :(得分:2)

请注意,您永远不会增加k的值,这意味着如果x / y == k且差值不为2点,它将继续下去,并且x / y永远不会再等于k。

我会想像这样的东西应该起作用

public static int scores(int k, int x, int y, int rally) {
    if ((x>=k || y>=k) && (Math.abs(x-y))>=2)
        return rally;
    else {
        rally++;
        return Math.min(scores(k, x + 1, y, rally), scores(k, x,y+1,rally));
    }
}

编辑:正如评论中指出的那样,此代码还有另一个问题,当相反的玩家每次都获得1分时会导致SO。


通过跟踪到目前为止找到的最小值,可以解决X和y在“获胜”中交替出现时发生的堆栈溢出错误:

public static int scores(int k, int x, int y, int rally) {
  return scores(k, x, y, rally, Integer.MIN_VALUE);
}

public static int scores(int k, int x, int y, int rally, int minSoFar) {
    if (rally >= minSoFar || ((x>=k || y>=k) && (Math.abs(x-y))>=2))
        return rally;
    else {
        rally++;
        minSoFar = Math.min(minSoFar, scores(k, x+1, y, rally));
        minSoFar = Math.min(minSoFar, scores(k, x, y+1, rally));
        return minSoFar;
    }
}

但应注意,最小路径将始终是X始终获胜(或Y始终获胜)的路径。所以:

return Math.max(2, k);

是表达结果的简便得多的方法。