关于java:为什么这个递归方法有效?

Why does this recursive method work?

我正在编写一个函数来满足这些要求:给定一个字符串,如果它是零对或多对括号的嵌套,如(())((())),则返回true。建议:检查第一个字符和最后一个字符,然后重复它们里面的内容。

1
2
3
nestParen("(())")true
nestParen("((()))")true
nestParen("(((x))")false

现场显示的正确解决方案是:

1
2
3
4
5
6
7
public boolean nestParen(String str) {
    if (str.equals("")) return true;
    if (str.charAt(0) == '(' && str.charAt(str.length()-1) == ')')
        return nestParen(str.substring(1,str.length()-1));
    else
        return false;
}

我不明白为什么会这样。如果给定的字符串有一个与"不同的字符,它是否会命中其他情况并返回false,而不是跳到下一个(呢?


如果输入字符串中包含除()以外的其他内容,这肯定不起作用,只需在调用此函数之前调用下面的另一个函数即可:

1
2
3
4
5
6
7
8
9
10
11
clean(String str){
    String str ="(((X+y)+z))";
    String retStr ="";
    for(int i = 0 ; i<str.length() ; i++){
        if(str.charAt(i) == '(' || str.charAt(i) == ')')
        {
            retStr += str.charAt(i);
        }
    }
    return retStr
}

然后使用retStr的输入调用递归函数。


正如许多示例代码中常见的那样,建议的正确解决方案是不适当的。

下面是一个实际正确的解决方案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public boolean nestParen(final String value)
{
    if (value != null)
    {
        if (value.isEmpty())
        {
            return true;
        }

        if (value.charAt(0) == '(' && value.charAt(value.length()-1) == ')')
        {
            return nestParen(value.substring(1, value.length()-1));
        }
        else
        {
           return false;
        }
    }
    else // value is null
    {
        return true;
    }
}

解释:(同另一个答案)

  • 如果参数不为空,请继续。这样可以防止NullPointerExceptions。
  • 如果参数为空,则返回true。如果一个字符串包含零个或多个嵌套对parens,而没有其他参数,那么问题似乎返回true。
  • 如果第一个字符是'('而最后一个字符是')',请去掉这些字符并再次检查(这是递归)。
  • 否则(第一个不是'('和/或最后一个不是')')返回false。
  • 最后,如果参数为空,则返回true(它包含零对,而不包含其他任何参数)。