post 递归函数中递增 vs +1
post increment vs +1 in recursive function
我正在研究 Leetcode #22 Generate Parentheses. 在他们的一个解决方案中,我注意到如果我们将 open+1
和 close+1
更改为 ++open
和 ++close
,代码不再起作用了。我以为我们仍然可以在递归中使用预增量,所以我不明白这里有什么不同。
class Solution {
public List<String> generateParenthesis(int n) {
List<String> ans = new ArrayList();
backtrack(ans, new StringBuilder(), 0, 0, n);
return ans;
}
public void backtrack(List<String> ans, StringBuilder cur, int open, int close, int max){
if (cur.length() == max * 2) {
ans.add(cur.toString());
return;
}
if (open < max) {
cur.append("(");
backtrack(ans, cur, open+1, close, max);
cur.deleteCharAt(cur.length() - 1);
}
if (close < open) {
cur.append(")");
backtrack(ans, cur, open, close+1, max);
cur.deleteCharAt(cur.length() - 1);
}
}
}
使用++open
和open+1
传值的区别在于,前者改变了变量open
的值,而后者则没有。也就是说,
- 如果open是,比如说2,在
++open
之后,open
的值就是3
- 然而,当你做
open+1
时,你只传递了3
,但open
的值仍然是2
。所以,下一个循环得到相同的值。
为了更好理解,以下等同于++open
:
backtrack(ans, cur, (open = open+1), close, max);
在上面的代码中,在将 open
的值传递给方法之前,计算括号表达式以将 open+1
的值设置为 open+1
。
我正在研究 Leetcode #22 Generate Parentheses. 在他们的一个解决方案中,我注意到如果我们将 open+1
和 close+1
更改为 ++open
和 ++close
,代码不再起作用了。我以为我们仍然可以在递归中使用预增量,所以我不明白这里有什么不同。
class Solution {
public List<String> generateParenthesis(int n) {
List<String> ans = new ArrayList();
backtrack(ans, new StringBuilder(), 0, 0, n);
return ans;
}
public void backtrack(List<String> ans, StringBuilder cur, int open, int close, int max){
if (cur.length() == max * 2) {
ans.add(cur.toString());
return;
}
if (open < max) {
cur.append("(");
backtrack(ans, cur, open+1, close, max);
cur.deleteCharAt(cur.length() - 1);
}
if (close < open) {
cur.append(")");
backtrack(ans, cur, open, close+1, max);
cur.deleteCharAt(cur.length() - 1);
}
}
}
使用++open
和open+1
传值的区别在于,前者改变了变量open
的值,而后者则没有。也就是说,
- 如果open是,比如说2,在
++open
之后,open
的值就是3
- 然而,当你做
open+1
时,你只传递了3
,但open
的值仍然是2
。所以,下一个循环得到相同的值。
为了更好理解,以下等同于++open
:
backtrack(ans, cur, (open = open+1), close, max);
在上面的代码中,在将 open
的值传递给方法之前,计算括号表达式以将 open+1
的值设置为 open+1
。