#java #recursion
#java #рекурсия
Вопрос:
Я готовлюсь к собеседованиям и пытаюсь практиковать рекурсию, вот мое решение проблемы, в которой требуется сгенерировать скобки ‘n’, т.е. Если n=1, то [[()]] если n=2, то [[()()], [(())]] и так далеевключено..
Вот мое решение, которое работает, но если я увеличиваю значение open перед вызовом рекурсивной функции, оно не работает, у меня есть список обоих в приведенном ниже коде, не уверен, почему это происходит :
public List<String> generateParenthesis(int n) {
List<String> rightAns = new ArrayList<>();
List<String> wrongAns = new ArrayList<>();
helper(0, 0, "", rightAns, n); //["((()))","(()())","(())()","()(())","()()()"] for n = 3
helperWrong(0, 0, "", wrongAns, n);//["((()))"] for n = 3
return rightAns;
}
public void helper(int open, int close, String cur, List<String> ans, int n){
if(cur.length() == 2*n){
ans.add(cur);
return;
}
if(open < n){
//open ; doesn't work
helper(open 1, close, cur "(", ans, n);
}
if(close < open){
//close ; doesn't work
helper(open, close 1, cur ")", ans, n);
}
System.out.println("cur" cur.toString());
return;
}
public void helperWrong(int open, int close, String cur, List<String> ans, int n){
if(cur.length() == 2*n){
ans.add(cur);
return;
}
if(open < n){
open ;
helperWrong(open, close, cur "(", ans, n);
}
if(close < open){
close ;
helperWrong(open, close, cur ")", ans, n);
}
System.out.println("cur" cur.toString());
return;
}
Комментарии:
1. разве новая строка уже не вызывает побочный эффект, поэтому, когда я вызываю функцию open / close, я ожидаю увеличения?
Ответ №1:
Постфиксный
оператор вычисляется после выражения. Например:
a=2;
b=a ; //b=2, a=3
То же самое при вызове функций:
a=2;
foo(a );
//a=3
void foo(int v){
//v=2
}
Таким образом, ваша рекурсивная функция получит значение до его увеличения.
Ответ №2:
попробуйте open
и close
, и cdalxndr объяснили, почему это не работает.