我正在尝试使用自己的直觉在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可以建议修复它,那么这将是伟大的。有其他解决方案,但由于我非常接近,我想改进我的。
答案 0 :(得分:3)
我认为您当前的逻辑版本有点过于简单,无法捕捉所有可能性。
这个问题归结为3种不同的情况:
为了遵循这个逻辑,我们需要跟踪我们剩下要使用的开放数量(下面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"));
};
});
});