Python 带有效括号的递归问题

Python 带有效括号的递归问题,python,algorithm,recursion,backtracking,Python,Algorithm,Recursion,Backtracking,我试图理解这个生成所有有效括号的解决方案 我不明白的是递归如何找到所有不同的组合。当我调试代码时,我在整数“left”和“right”上放置了一个手表。在generateParenthesis中输入2,在“ans”填充了1个有效括号之后,在“return ans”处,我看到变量“right”减少,使得if语句“right

我试图理解这个生成所有有效括号的解决方案

我不明白的是递归如何找到所有不同的组合。当我调试代码时,我在整数“left”和“right”上放置了一个手表。在generateParenthesis中输入2,在“ans”填充了1个有效括号之后,在“return ans”处,我看到变量“right”减少,使得if语句“right 下面,我将这个问题与一个在线Python调试器结合起来,看看我在说什么。

def generateParenthesis(N):
ans=[]
S=“”
左=0
右=0
ans=回溯(N、S、左、右、ans)
def回溯(N、S、左、右、ans):
打印(左)
如果len=2*N:
ans.append(S)
如果左侧
右侧变量永远不会减少。您可以看到早期递归执行的值。如果在输出中包含当前递归级别,则可能会更清楚:

print(" "*len(S), S, left, right)

  0 0
  ( 1 0
   (( 2 0
    (() 2 1
     (()) 2 2
   () 1 1   <-- left and right do not decrease, this is the call after `( 1 0` above
    ()( 2 1
     ()() 2 2

这与Python中框架的工作方式有关。在程序的执行过程中,我们基本上从使用具有GeneratePanthesis中的值的变量调用回溯开始,然后由于left小于N,我们得到一个对回溯的递归调用,left被迭代,程序沿着这条线继续,在递归调用之后。因此,在程序到达下一行之前,打开一组新帧,执行一组不同的操作,发现该帧中的左右相等,并返回答案。你正在看到类似的事情发生;基本上,你们进入一个较后的帧,然后一旦那个帧被关闭,返回到一个较早的帧,在该帧中,右图较少。右图从未减少,程序只是返回到右图较少的较早帧。我建议pythontutor.com将其可视化

print(" "*len(S), S, left, right)

  0 0
  ( 1 0
   (( 2 0
    (() 2 1
     (()) 2 2
   () 1 1   <-- left and right do not decrease, this is the call after `( 1 0` above
    ()( 2 1
     ()() 2 2
def generateParenthesis(N):
   return backtrack(N, S="", left=0, right=0)

def backtrack(N, S, left, right):
   print(" "*len(S), S, left, right)
   if len(S) == 2 * N:
       yield S
   if left < N:
       yield from backtrack(N, S+'(', left+1, right)
   if right < left:
       yield from backtrack(N, S+')', left, right+1)
    
print(list(generateParenthesis(2)))