想象一下,我有四个字母a,b,c和d。我想确定有效括号和乘法的方法是什么。例如(a.b)。(c.d)可以是解决方案或(a。(b.c))。另一种解决方案。 4个字母的组合数为5。 (这也相当于加泰罗尼亚数字n-1,在这种情况下加泰罗尼亚数字3是5)。
我已经意识到这些组合可以写成完整的二叉树,每个二叉树代表一个组合:
abcd abcd
/ \ / \ .....
/ \ / \
a bcd ab cd
/ \ / \ /\
bc d a b c d
/ \
b c
从最深的叶子开始,算法可以为第一棵树生成例如:1 - (b.c)然后2 - (b.c).d然后3- a。((b.c).d)。
我想要一个递归或正常的函数,它可以生成所有可能的树并进行乘法,但不知道如何实现它。非常感谢任何帮助和建议。
答案 0 :(得分:0)
这里是来自How to print all possible balanced parentheses for an expression?的ninjagecko Python代码的JavaScript改编
function associations(seq, kw){
var grouper = kw.grouper || ((a,b) => [a,b]),
lifter = kw.lifter || (x => [x]);
if (seq.length === 1){
return lifter(seq[0]);
} else {
var result = [];
for (let i=1; i<seq.length; i++){
// split sequence on index i
var left = seq.slice(0,i),
right = seq.slice(i);
// return cartesian product of left x right
for (let l of associations(left,kw))
for (let r of associations(right,kw))
result.push(grouper(l,r));
}
return result;
}
}
console.log(JSON.stringify(associations([1,2,3,4],{})));
&#13;