微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在这个“生成括号”问题中回溯如何工作?

如何解决在这个“生成括号”问题中回溯如何工作?

我将下面的代码放入调试器中,看到对于 n=2 的基本情况,当函数到达第 7 行时,return 语句返回并弹出最后 3 个括号。这是为什么,我以为return语句应该是退出函数

stack = []
res = []
n=2
def backtrack(openN,closedn):
  if openN == closedn ==n:
     res.append("".join(stack))
     return

  if openN < n:
     stack.append("(")
     backtrack(openN+1,closedn)
     stack.pop()

  if closedn < openN:
     stack.append(")")
     backtrack(openN,closedn+1)
     stack.pop()

backtrack(0,0)
print(res)

结果是:['(())','()()']

解决方法

添加调试打印语句对操作进行跟踪很有指导意义。

我们调用 generateParenthesis。使用默认参数 S = [] 调用回溯。我们到达第二个 if,附加一个 ( 并再次调用回溯。采用相同的路径,并再次调用回溯。现在调用堆栈是:

generateParenthesis
  backtrack([],0)
    backtrac(['('],1,0)
      backtrack(['(','('],2,0)

这次left不小于n,所以我们取第三个if。我们附加一个右括号并再次调用回溯。走同样的路,所以我们最终得到:

generateParenthesis
  backtrack([],0)
    backtrack(['('],0)
        backtrack(['(','(',')'],1)
          backtrack(['(',')',2)

此时,len(S) == 2 * n 为真,因此我们采用第一个选项。我们附加到 ans 列表并返回,但这仅从最里面的调用返回。

generateParenthesis
  backtrack([],1)

那个电话被留在了第三个 if 的中间。它从 S 弹出并返回,留给我们

generateParenthesis
  backtrack([],0)

依此类推,直到最终调用返回。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。