我对以下挑战有疑问:
两个玩家(编号为 1 和 2)正在玩 n 个棋子的游戏。玩家 1 始终先玩,两名玩家轮流移动。游戏规则如下:
在一次移动中,玩家可以从游戏板上移走 2,3 或 5 个石子。 如果玩家无法采取行动,则该玩家输掉游戏。 给定石头数量,找到获胜者的姓名(即第一名或第二名)并将其打印在新行上。每个玩家都以最佳方式进行游戏,这意味着如果存在更好的获胜棋步,他们就不会采取导致输掉比赛的棋步。
(输出格式
在每个测试用例的新行中,如果第一个玩家是获胜者,则打印“First”;否则,打印“Second”。)
示例:
金额 = 7,玩家 = 1。
调用 getWinner(7-5,-1)
金额 = 2,玩家 = -1
调用 getWinner(2-2,1)
金额= 0,玩家= 1
该函数不应在此处返回任何内容,因为它会中止搜索,但编译器强制我添加 return 语句。
public static String getWinner(int amount, int player){
if (amount == 0 || amount == 1){
if (player == -1) {
return "First";
}
} else if (amount-5 >=0){
return getWinner(amount-5,-player);
} else if (amount-3 >=0) {
return getWinner (amount-3,-player);
} else if(amount-2 >= 0){
return getWinner (amount -2 , -player);
} else {
return "Second";
}
return "failure";
}
最佳答案
该代码没有意义,因为您实际上从未选择任何东西,而是先做任何事情。此外,对于游戏的每一步来说,有些选择可能会让你输,有些选择会让你赢,所以你需要知道你想要什么。
您需要根据对手输掉的情况来遵循 2、3 或 5。
private static boolean wins(int amount){
if (amount < 0 ) {
return true; // game already over, previous player lost
} else if ( amount <= 1){
return false; // you loose always
} else {
// we win if the opponent doesn't
return wins(amount-5) == false ||
wins(amount-3) == false ||
wins(amount-2) == false;
}
}
正如您所看到的,默认情况是在递归之间进行或操作。它会在第一个递归变为 false 时停止,结果将为 true,否则为 false。
关于java - 跳过递归中不需要的返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39191675/