这个问题在这里已有答案:
我做了一个递归的方法来找到在一个或另一个团队获胜之前可以玩的最少数量的集会,给定得分团队应该得分为胜利-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
我对此非常不好,请帮助我
请注意,你永远不会增加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));
}
}
编辑:正如评论中所指出的,这段代码还有另一个问题,即当对方玩家每次都得到一分时,会导致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);
是一种更容易表达结果的方式。