2014-10-17 4 views
0

Я пишу функцию для выполнения этих требований: Для строки верните истину, если она является гнездом из нуля или нескольких пар скобок, например (()) или ((())). Предложение: проверьте первый и последний символы, а затем повторите то, что внутри них.Почему этот рекурсивный метод работает?

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

Я не понимаю, почему это работает. Если заданная строка имеет символ, отличный от (, как ", не будет ли он ударить в случае else и вернуть false, а не перейти к следующему (?

+1

Вы правы; 'nestParen (" ((x)) ")' вернет false. –

+1

Да, это будет, как утверждают требования. –

+0

Ни одна из этих строк не содержит символа '' '. – AdamMc331

ответ

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. если параметр не является нулевым, по-прежнему. Это предотвращает NullPointerExceptions.
  2. Если параметр пуст, верните значение true. Кажется, что проблема возвращает true, если строка содержит нулевые или более вложенные пары парнеров и ничего больше.
  3. Если первый символ равен '(' и последний символ ')', разделите эти символы и снова проверьте (это рекурсия).
  4. в противном случае (первый не является ('и/или последний не является)) возвращает false.
  5. Наконец, если параметр был равен нулю, верните true (он содержит нулевые пары и ничего больше).
2

Это, безусловно, не будет работать, если входная строка содержит некоторые вещи, кроме ( и ), чтобы сделать эту работу просто вызвать другую функцию, как показано ниже перед вызовом этой функции:

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.

Смежные вопросы