我遇到了以下挑战的问题:
两名球员(编号为1和2)正在玩n石头游戏。玩家1总是先玩,两个玩家轮流移动。游戏规则如下:
在一次移动中,玩家可以从游戏板上移除2,3或5个宝石。 如果玩家无法移动,该玩家将失去游戏。 给定石头的数量,在新线上找到并打印获胜者的名字(即,第一或第二)。每个玩家都以最佳方式进行游戏,这意味着如果存在更好的获胜动作,他们就不会采取行动导致他们输掉游戏。
(输出格式
在每个测试用例的新行上,如果第一个玩家是赢家,则打印“First”;否则,打印“秒”。)
示例:
金额= 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";
}
答案 0 :(得分:1)
代码没有意义,因为你从来没有真正选择任何东西,而是先做任何事情。同样对于游戏的每一步,可能有些选择让你失去,有些让你赢,所以你需要知道自己喜欢什么。
你需要根据对手的失败来追随2,3或5。
print("Hello world", terminator: "")
正如您所看到的,默认情况是在递归之间。它会在第一次递归时停止,该递归变为false,结果为true,否则为false。
答案 1 :(得分:0)
你的问题是,当第一个条件(amount == 0 || amount == 1
)为真时,你并不总是返回(你只返回player==-1
),所以就编译器而言,并非所有if
- else if
-...- else
语句的分支返回一个值,这就是为什么你被迫添加一个return语句作为方法的最后一个语句。
您可以按如下方式重写逻辑以消除return "failure"
:
public static String getWinner(int amount, int player){
if (amount == 0 || amount == 1){
if (player == -1) {
return "First";
} else {
return "Second";
}
} else if (amount-5 >=0){
return getWinner(amount-5,-player);
} else if (amount-3 >=0) {
return getWinner (amount-3,-player);
} else { // you no longer need the else if(amount-2 >= 0) condition
// since it must be satisfied at this point
return getWinner (amount -2 , -player);
}
}
另一种选择:
public static String getWinner(int amount, int player){
if ((amount == 0 || amount == 1) && 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";
}
}