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