java - 跳过递归中不需要的返回

标签 java recursion

我对以下挑战有疑问:

两个玩家(编号为 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/

相关文章:

java - 无法构建 Hibernate SessionFactory,由 : org. hibernate.AnnotationException 引起:

python - 如何在几行 Python 代码中编写许多嵌套的 for 循环?

arrays - Bash,递归中使用相同的变量

python - 如何在 pandas 数据框列上最好地执行递归

java - Facebook - 如何实用地发布到 Facebook 页面? |刷新访问 token

java - Gradle 生成的 Scala JAR 出现 "Could not find or load main class"错误

java - 增加索引后如何递归添加?

recursion - 使用 Swift 运算符定义避免无限递归?

java - 如何使用 jsoup 从这个 html 页面获取文本?

java - 将标识符与字符串、数字和 _ 进行匹配