给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
一开始这么递归,为什么总会少几个,而且重复的很多,我寻思着和下面的代码也没差别
def khsc(n0,left,right,ans,resule):
if left==n0 and right==n0 and ans not in resule:
resule.append(ans)
return
if left<n0:
ans=ans+'('
left=left+1
khsc(n0,left,right,ans,resule)
if right<left:
ans=ans+')'
right=right+1
khsc(n0,left,right,ans,resule)
resule=[]
khsc(n,0,0,'',resule)
return resule
用下面递归这么写就没错,没明白,还排93%
def khsc(n0,left,right,ans,resule):
if len(ans)==2*n : #不用加and ans not in resule,竟然不会重复
resule.append(ans)
return
if left<n0:
khsc(n0,left+1,right,ans+'(',resule)
if right<left:
khsc(n0,left,right+1,ans+')',resule)
resule=[]
ans=''
khsc(n,0,0,ans,resule)
return resule
想了一会儿,我明白了
如果我选择在函数外面+1,那么下一个if里的函数也会被+1,影响了两个函数
if left<n0:
ans=ans+'('
left=left+1
我实验了一下:
def aa(left,right):
print("left= ",left)
print("right= ",right)
print("---")
if left<right:
left=left+1
print("if left= ",left)
print("if right= ",right)
print("+++")
if right <9:
right=right+1
print("if left= ",left)
print("if right= ",right)
print("+++")
aa(2,4)
输出是
left= 2
right= 4
---
if left= 3
if right= 4
+++
if left= 3
if right= 5
+++
也就是说两个if都满足的时候,第一个if里left+1,那么在第二个if本来只希望right+1,现在成了left right都+1