Catalan数 &&Python实现
1、Catalan数
卡塔兰数是组合数学中一个常在各种计数问题中出现的数列。如:
1,1,2,5,14,42,132,429,1430,4862……其递归式如下:
h(n)= h(0)*h(n-1)+h(1)*h(n-2) + … +h(n-2)*h(1)+ h(n-1)*h(0)
(其中n>=2,h(0) = h(1) = 1)
其递归式的解为h(n)=c(2n,n)/(n+1)
用Python代码实现非常简单,仅仅一个递归就可以了:
def catalan(n):
if n==0 or n==1:
return 1
return (4*n-2)*catalan(n-1)/(n+1)
Catalan数在计算机排列组合中占有非常重要的比重,应用非常广泛,应用如下:
应用1描述:n对括号有多少种匹配方式?
应用2描述:矩阵链乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?
应用3描述:一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?
应用4描述:n个节点构成的二叉树,共有多少种情形?
应用5描述:一个平面凸n+2边形,若用其对角线将其划分为三角形,总共有多少种不同的划分方法?
应用5描述:有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?
这些问题都非常相似,都是采用递归的方法!