为什么用递归来停止isRoundNumber

时间:2015-06-21 11:21:40

标签: java recursion

我在Java中有以下代码:

public static boolean isRoundNumber(String s) {
    System.out.println("the string is: "+s);
    if (s.length() == 0) {
        System.out.println("check 1");
        return false;
    }
    if (s.length() == 1) {
        System.out.println("check 2");
        return Character.isDigit(s.charAt(0));
    } else {
        System.out.print("checking: " + s.charAt(0)+ " | ");
        return (Character.isDigit(s.charAt(0))
                && isRoundNumber(s.substring(1)));
    }
}

当我输入

 public static void main(String[] args) {
    System.out.println("the string is a round number: " + isRoundNumber("1x143"));
}

输出

the string is: 1x143
checking: 1 | the string is: x143
checking: x | the string is a round number: false

当我从Character.isDigit(s.charAt(0)) &&案例中删除else时,输出为

the string is: 1x143
checking: 1 | the string is: x143
checking: x | the string is: 143
checking: 1 | the string is: 43
checking: 4 | the string is: 3
check 2
the string is a round number: true

如果我不在退货中删除Character.isDigit(s.charAt(0)),为什么该方法会停止(并给出正确答案)?

2 个答案:

答案 0 :(得分:3)

  

如果我不在退货中删除Character.isDigit(s.charAt(0)),为什么该方法会停止(并给出正确答案)?

它停止,因为&&运算符短路表达式:

return (Character.isDigit(s.charAt(0))
                && isRoundNumber(s.substring(1)));

使用&&,如果第一个操作数(&&之前的位)是false,则永远不会评估第二个操作数 - 因此递归调用isRoundNumber没有发生。仅当第一个操作数为&&时,才会计算第二个操作数(true之后的位)。

答案 1 :(得分:0)

  

如果我不在返回中删除Character.isDigit(s.charAt(0)),为什么该方法会停止(并给出正确的答案)?

因为&&是短路运营商。当Java评估a && b的值时,它首先评估a。如果它是假的,它甚至不评估b,因为无论b的值是什么,结果总是为假。这就是为什么它不会调用isRoundNumber(s.substring(1))Character.isDigit(s.charAt(0))为false,因为第一个字符是'x'。

请注意||也是如此:如果a || b为真,b甚至不评估a。因为无论b的值是什么,表达将是真实的。