【问题标题】:post increment vs +1 in recursive function递归函数中的后增量vs +1
【发布时间】:2022-01-11 00:47:57
【问题描述】:

我正在研究Leetcode #22 Generate Parentheses. 在他们的一个解决方案中,我注意到如果我们将open+1close+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);
        }
    }
}

【问题讨论】:

  • 如果您将backtrack(ans, cur, open+1, close, max) 中的open+1 更改为++open,您将更改在if (close &lt; open) 条件下测试的值。

标签: java recursion backtracking


【解决方案1】:

使用++openopen+1传值的区别在于,前者改变了变量open的值,而后者则没有。也就是说,

  • 如果打开是,比如说2,在++open之后,open的值是3
  • 但是,当您执行open+1 时,您只传递了3,但open 的值仍然是2。因此,下一个循环得到相同的值。

为了更好的理解,下面等价于++open

backtrack(ans, cur, (open = open+1), close, max);

在上面的代码中,括号中的表达式在传递给方法之前被评估以将open的值设置为open+1

【讨论】:

    猜你喜欢
    • 2015-03-14
    • 1970-01-01
    • 2014-06-04
    • 2018-06-21
    • 1970-01-01
    • 2013-07-14
    • 2012-07-18
    • 1970-01-01
    • 2018-10-11
    相关资源
    最近更新 更多