Почему 1 работает здесь, а operator нет

#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 объяснили, почему это не работает.