在递归中跳过不需要的返回

时间:2016-08-28 13:18:10

标签: java recursion

我遇到了以下挑战的问题:

两名球员(编号为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";
}

2 个答案:

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