为什么这种递归方法有效?

时间:2014-10-17 17:27:48

标签: java string recursion

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

nestParen("(())") → true
nestParen("((()))") → true
nestParen("(((x))") → false

网站上显示的正确解决方案是:

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而不是跳到下一个(

2 个答案:

答案 0 :(得分:1)

如果输入字符串包含除()之外的其他内容以使此工作在调用此函数之前调用另一个函数,那么这肯定不会起作用:

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 :(得分:0)

正如许多示例代码所示,建议的正确解决方案是不合适的。

这是一个实际上正确的解决方案:

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;
    }
}

说明:(与其他答案相同)

  1. 如果参数不为null,则继续。这可以防止NullPointerExceptions。
  2. 如果参数为空,则返回true。如果一个字符串包含零个或多个嵌套的parens对,则该问题似乎返回true。
  3. 如果第一个char是'('和最后一个char是')',请删除这些字符并再次检查(这是递归)。
  4. 否则(首先不是'(和/或最后不是')')返回false。
  5. 最后,如果参数为null,则返回true(它包含零对,没有别的)。