程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在这个“生成括号”问题中回溯如何工作?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

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

开发过程中遇到在这个“生成括号”问题中回溯如何工作?的问题如何解决?下面主要结合日常开发的经验,给出你关于在这个“生成括号”问题中回溯如何工作?的解决方法建议,希望对你解决在这个“生成括号”问题中回溯如何工作?有所启发或帮助;

我将下面的代码放入调试器中,看到对于 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)

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

大佬总结

以上是大佬教程为你收集整理的在这个“生成括号”问题中回溯如何工作?全部内容,希望文章能够帮你解决在这个“生成括号”问题中回溯如何工作?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。