n + 1个因子的不同方式的数量可以完全括号

时间:2017-03-28 14:06:51

标签: javascript algorithm parsing recursion tree

想象一下,我有四个字母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)。

我想要一个递归或正常的函数,它可以生成所有可能的树并进行乘法,但不知道如何实现它。非常感谢任何帮助和建议。

1 个答案:

答案 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;
&#13;
&#13;