在python中打印括号的有效组合
我试图使用自己的直觉在python中打印所有有效的括号组合。它几乎成功了,但只是没有打印出几个组合。代码如下所示在python中打印括号的有效组合,python,recursion,Python,Recursion,我试图使用自己的直觉在python中打印所有有效的括号组合。它几乎成功了,但只是没有打印出几个组合。代码如下所示 solution = "" def parentheses(n): global solution if n == 0: print solution return for i in range(1, n+1): start_index = len(solution) solution =
solution = ""
def parentheses(n):
global solution
if n == 0:
print solution
return
for i in range(1, n+1):
start_index = len(solution)
solution = solution + ( "(" * i + ")" * i )
parentheses(n - i)
solution = solution[:start_index]
if __name__ == "__main__":
n = int(raw_input("Enter the number of parentheses:"))
print "The possible ways to print these parentheses are ...."
parentheses(n)
对于n=3,它会打印
()()(())
(())()
((())
它是这样工作的 在第一次迭代中 ()将被打印,当调用返回到直接父级时,它将从列表中首先开始追加的部分开始,现在是()并运行循环的下一次迭代以打印()(()),依此类推 问题是我无法用这种逻辑捕捉到这种组合 (())
当我在考虑如何修复它时,如果任何python大师都能提出修复建议,那就太好了。有其他的解决方案,但由于我的解决方案非常接近,我想改进我的解决方案。我认为您当前版本的逻辑有点过于简单,无法捕捉所有的可能性 这个问题归结为三种不同的情况:
no
如下)、当前的未平仓字符串以及当前的未平仓与已平仓余额(加铺
如下):
这似乎是一种自然的使用<代码>括号(10)将涉及
括号(6)
和括号(4)
,但是括号(9)
也将涉及括号(6)
——因此括号(6)
应该只计算一次。此外--使用集合是很自然的,因为这样可以防止例如()
被计数两次,一次作为()+()()
,一次作为()+()
。这将导致以下代码,它要么在为n-1
生成的括号周围加上一对新的括号,要么将前面两个调用的结果串联起来:
cache = {}
def parentheses(n):
if n == 0:
return set([''])
elif n in cache:
return cache[n]
else:
par = set('(' + p + ')' for p in parentheses(n-1))
for k in range(1,n):
par.update(p+q for p in parentheses(k) for q in parentheses(n-k))
cache[n] = par
return par
比如说,
>>> for p in parentheses(3): print(p)
(()())
((()))
()(())
()()()
(())()
我认为任何直接的修改都不会奏效,因为您试图将圆括号(n)减少为通过单个调用圆括号(k)获得的字符串(其中k
>>> for p in parentheses(3): print(p)
(()())
((()))
()(())
()()()
(())()