我有一个有趣的组合问题,我有点卡住了
让我们定义一个函数p(xn),它返回方程x的'()'数 现在x只能采用x1 + x2 + x3 ... xn的形式 该函数定义为n> = 2
示例:
P(x2)=(x1 + x2)= 1
p(x3)=((x1 + x2)+ x3)和(x1 +(x2 + x3))
p(x4)=
((x1 + x2)+(x3 + x4))
(((x1 + x2)+ x3)+ x4)
((x1 +(x2 + x3))+ x4)
(x1 +((x2 + x3)+ x4))
(x1 +(x2 +(x3 + x4)))
等等 注意(x1 +(x2 + x3)+ x4)不是有效的例子 每个+
必须有一个()现在,我试图想出一个P的公式,它将决定组合的数量 我不确定是否有固定的公式或递归定义取决于其先前的术语。你能帮我弄清楚这个公式吗?
答案 0 :(得分:2)
基本上,您要计算唯一二进制表达式树的数量,其中节点是求和,叶子是x 1 到x n 。我们称这个数字为P(n)。
您可以选择任何n-1个总结作为根节点。让我们选择第k个总和。根目录左侧有k个变量,因此您可以用P(k)方式组织左子树。右边有n-k个变量,所以右边的子树可以用P(n-k)方式组织。因此,总的来说,您可以用P(k)P(n-k)不同的方式组织树。
由于您可以从1到n-1自由选择k,因此用n叶子组织表达式树的总数是:
P(n) = P(1)P(n-1) + P(2)P(n-2) + ··· + P(n-2)P(2) + P(n-1)P(1)
正如@DSM在评论中所指出的,这种递归关系会产生加泰罗尼亚数字。有一个封闭形式的解决方案,但从递推公式推导出来有点棘手。您可以在Wikipedia article for Catalan numbers中找到该公式的几个证明。解决方案是:
P(n) = C(2n,n)/(n+1) where C(n,k) = n! / (k!(n-k)!)