如何解决在这个“生成括号”问题中回溯如何工作?
我将下面的代码放入调试器中,看到对于 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 举报,一经查实,本站将立刻删除。