java - 在递归方法中返回值是如何工作的? [Java]

标签 java recursion switch-statement return-value boolean-expression

TLDR: java 似乎只在方法运行时返回第一个值。我对此是否错了,或者是否有我不知道的解决方法[不诉诸循环]

我的目标是从分配给该方法的返回中输出最后一个值[ boolean ],但是如果没有正确理解返回的工作原理,我无法做到这一点。

<小时/>

代码的目的是通过读取用户输入从简单的选择 [Y/N] 返回一个 boolean 值。如果给出了错误的输出[例如:“p”,“P”,“apples”],该方法应再次提示用户,直到给出正确的输入。

这就是我开始时的情况:

private Boolean nrCheck()
{   
    Scanner sc = new Scanner (System.in);
    Boolean isNewRelease;


    System.out.println("New Release [Y/N]? ");      
    String movieType = sc.nextLine();       

    switch (movieType)
    {
        case "Y" : case "y" :              isNewRelease = true;  break;
        case "N" : case "n" :              isNewRelease = false; break;
        default  : /*Try again*/ nrCheck();                      break; 
    }

    return isNewRelease;
}

显然这是行不通的,因为默认情况下不会赋值, 导致初始化错误。

尝试通过分配默认值来解决此问题,如下所示:

private Boolean nrCheck()
{   
    Scanner sc = new Scanner (System.in);
    Boolean isNewRelease;


    System.out.println("New Release [Y/N]? ");      
    String movieType = sc.nextLine();       

    switch (movieType)
    {
        case "Y" : case "y" :        isNewRelease = true;            break;
        case "N" : case "n" :        isNewRelease = false;           break;
        default  : /*printTryagain*/ isNewRelease = null;  nrCheck();break; 
    }

    return isNewRelease;
}

这提出了一个新问题。由于某种原因,当我再次调用该方法时,返回值已经设置了。我尝试过调整代码的顺序,但它并没有多大作用。我的猜测是,一旦调用该方法,返回值就会自动设置,并且如果第一次设置,则无法更改它。

我知道我可以做到这一点,

private Boolean nrCheck()
{   
    Scanner sc = new Scanner (System.in);
    Boolean isNewRelease;


    System.out.println("New Release [Y/N]? ");      
    String movieType = sc.nextLine();       

    do 
    {
        switch (movieType)
        {
            case "Y" : case "y" :        isNewRelease = true;            break;
            case "N" : case "n" :        isNewRelease = false;           break;
            default  : /*printTryagain*/ isNewRelease = null;  nrCheck();break; 
        }
    }
    while (movieType.equalsIgnoreCase("Y") || movieType.equalsIgnoreCase("N"))

    return isNewRelease;
}

但个人不喜欢这样做,除非我完全意识到没有其他解决方案,或者我的代码中没有明显的错误。 [还想扩展此代码以变得更加通用]。

最终,我希望能够理解我犯了什么错误,或者如果没有任何错误,在这种情况下 return 的限制,即使这意味着我必须废弃 do-while 循环的代码。

最佳答案

您应该返回递归调用返回的值:

private boolean nrCheck()
{   
    Scanner sc = new Scanner (System.in);

    System.out.println("New Release [Y/N]? ");      
    String movieType = sc.nextLine();       

    switch (movieType)
    {
        case "Y" : case "y" : return true;
        case "N" : case "n" : return false;
        default  : return nrCheck();
    }
}

如果您忽略该值,则首先进行递归调用就没有意义。

P.S.,您可以将该方法的返回类型更改为 boolean,因为它永远不会返回 null

关于java - 在递归方法中返回值是如何工作的? [Java],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50368736/

相关文章:

Java将Observable列表中的列分配给@fxml列

java - 递归方法中的逻辑错误

java - JPA OneToMany、ManyToOne 关系的无限递归引用

java - 编译时常量在 Switch Case Java 中的使用

Eclipse:如何在控制台窗口和编辑器之间切换?

php - 每个案例使用多个值进行 PHP 切换的最佳方法是什么?

Java 向 PHP 服务器发送 POST 数据被 accessRules 方法阻止

java - 从 JSONArray 中删除可重复的值 (Java)

java - 将 +n 添加到某些 id 以 "v + number"结尾的字符串的名称中

在 C 中的递归函数中收集数据