在python

时间:2015-10-21 17:53:42

标签: 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 + ( "(" * 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 guru可以建议修复它,那么这将是伟大的。有其他解决方案,但由于我非常接近,我想改进我的。

2 个答案:

答案 0 :(得分:3)

我认为您当前的逻辑版本有点过于简单,无法捕捉所有可能性。

这个问题归结为3种不同的情况:

  1. 我们使用了所有开括号,只需关闭它们
  2. 我们目前没有任何打开的括号,需要在再次关闭之前添加一个
  3. 我们至少有一个打开,可以打开一个新的或关闭一个。
  4. 为了遵循这个逻辑,我们需要跟踪我们剩下要使用的开放数量(下面no),当前的parens字符串以及当前的开放与关闭余额( curb以下):

    def parens(no, s="", curb=0):
        # case 1: all open parens used
        if no == 0: 
            if curb == 0: 
                return [s]
            return parens(no, s+")", curb-1) 
    
        # case 2: none are currently open
        if curb == 0:
            return parens(no-1, s+"(", curb+1)
    
        # case 3: one or more are currently open
        return parens(no-1, s+"(", curb+1) + parens(no, s+")", curb-1)
    

答案 1 :(得分:1)

这似乎是memoization的自然用法。 parenthesis(10)会涉及parentheses(6)parentheses(4),但parentheses(9) 也会涉及parentheses(6) - 所以parenthesis(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)

(()())
((()))
()(())
()()()
(())()

例如,

$("body").on("keypress", function(e) {
    if(e.which != 13) {
       return;
    };
    $("a").each(function() {
        var link = $(this);
        if(link.text() == "Update") {
            console.log("woot");
            window.open(link.attr("href"));
        };
    });
});