在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 =

我试图使用自己的直觉在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 + ( "(" * 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) (()()) ((())) ()(()) ()()() (())()