卡特兰数 - 图1
    数列特征为:1, 1, 2, 5, 14, 42, 132, 429,…

    1. #用python实现是为了防止计算溢出,因为catalan实在是递增太猛了,calanta(20) 就能使得int溢出
    2. def catalan(int n):
    3. if n==0 or n==1:
    4. return 1
    5. return (4*n-2)*catalan(n-1)/(n+1)

    应用场景:


    由n个+1和n个-1构成2n项卡特兰数 - 图2其部分和满足卡特兰数 - 图3的序列个数等于第n个Catalan数卡特兰数 - 图4


    左括号和右括号各有n个时,合法括号表达式的个数


    对于n+1个数连乘,乘法顺序有卡特兰数 - 图5


    n个节点构造二叉树的所有可能形态数为卡特兰数 - 图6


    n个非叶节点的满二叉树的形态数(对称后得到的二叉树除非自己本身对称,否则算是不同)


    对于一个n*n的正方形网格,每次只能向右或者向上移动一格,那么从左下角到右上角所有在副对角线右下方的路径总数为卡特兰数 - 图7

    卡特兰数 - 图8
    可以将一条水平边记为+1,垂直边记为-1,那么就组成了一个n个+1和n个-1的序列,并且保证前k步中水平边数不小于垂直边数,换句话说前k个元素的和非负


    对凸n+2边形进行不同的三角形分割(只连接顶点对形成n个三角形)数为Cn

    卡特兰数 - 图9
    也可以换一种说法: 平面上连接可以形成凸包的2n个点分成2个一组连成n条线段,两两线段之间不相交的情况总数是卡特兰数 - 图10


    n个数入栈后的出栈的排列总数是卡特兰数 - 图11


    对于集合卡特兰数 - 图12,将集合元素两两分为n个子集,若任意两个子集都不交叉,那么我们称此划分为一个不交叉划分。此时不交叉的划分数就是卡特兰数 - 图13


    n层的阶梯切割为n个矩形的切法数也是卡特兰数 - 图14。如下图所示:

    卡特兰数 - 图15


    在一个2*n的格子中填入1到2n这些数值使得每个格子内的数值都比其右边和上边的所有数值都小的情况数也是卡特兰数 - 图16


    n+m个人排队买票,并且满足卡特兰数 - 图17,票价为50元,其中n个人各手持一张50元钞票,m个人各手持一张100元钞票,初始时候售票窗口没有钱,问有多少种排队的情况数能够让大家都买到票。 如果m=n的话那么这就是初始的Catalan数问题,也就是将手持50元的人看成是+1,手持100元的人看成是-1,任前k个数值的和都非负的序列数。

    其他著名的数列有:
    Fibonacci :0, 1, 1, 2, 3, 5, 8, 13, 21,…
    碰到有些组合问题,求有多少种组合方式的,在看不出规律时,不妨从简单的开始,数学归纳法举例,或许可以发现这是一个特殊的数列呢。
    比如image.png
    如果不举例归纳,就不会发现这是一个Fibonacci 数列了,竟如此简单。