java中的递归调用导致不正确的行为

时间:2016-08-25 18:20:45

标签: java algorithm recursion

我有一个递归调用,显示出奇怪的行为。

    public String recursionMethod() {
    String repeatRun = null;
    repeatRun = scanner.next();
    if (!("Y".equals(repeatRun) || "N".equals(repeatRun))) {
        System.out.println("Please enter the correct value. (Y/N)");
        this.recursionMethod();
    }
    System.out.println("value of the entered variable->"+repeatRun);
    return repeatRun;
}

当方法第一次运行时,我输入值“no”。正如预期的那样,它进入if块,因此它再次调用自己要求输入“Y”或“N”。这一次,我输入“Y”。它不会再次进入if块,但日志会打印出来。

Do you want to enter another directory? (Y/N)
no
Please enter the correct value. (Y/N)
Y
value of the entered variable->Y
value of the entered variable->no

这种行为很奇怪。为什么再次选择旧价值?在调试模式下运行时,它显示控件进入返回行后,它再次转到if块内的“this.recursionMethod()”行。

请帮助我理解,以及如何解决这个问题,以便我的方法不会返回之前的值。

2 个答案:

答案 0 :(得分:1)

试试这个:

    public String recursionMethod() {
        String repeatRun = null;
        repeatRun = scanner.next();
        if (!("Y".equals(repeatRun) || "N".equals(repeatRun))) {
            System.out.println("Please enter the correct value. (Y/N)");
            return this.recursionMethod();
        }
        System.out.println("value of the entered variable->"+repeatRun);
        return repeatRun;
    }

您忘记了在进行递归调用的if块中的返回。

答案 1 :(得分:0)

当您检查键入的值是Y还是N时,如果值错误,则要求用户再次键入新值,进行递归调用。但是,当该重新调用结束时,该方法一直持续到结束,首先打印输入的值。正确的实施应该是:

if (!("Y".equals(repeatRun) || "N".equals(repeatRun))) {
    System.out.println("Please enter the correct value. (Y/N)");
    repeatRun = this.recursionMethod();
}
else {
    System.out.println("value of the entered variable->"+repeatRun);
}

return repeatRun;