卡特兰数又称卡塔兰数,卡特兰数是组合数学中一个常出如今各类记数问题中的数列。spa
一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不一样的出栈序列?(进栈的顺序已经肯定了,且n>=2)orm
1.咱们设 f(n)=序列个数为n的出栈序列种数。同时,咱们假定,从开始到栈第一次出到空为止,这段过程当中第一个出栈的序数是k。特别地,若是栈直到整个过程结束时才空,则k=n。blog
2.第一个出栈的序数k将1~n的序列分红两个序列,其中一个序列是1~k-1,序列个数为k-1,另一个序列是k+1~n,序列个数是n-k。数学
3.咱们若把k视为肯定一个序数,那么根据乘法原理,f(n)的问题就等价于——序列个数为k-1的出栈序列种数乘以序列个数为n - k的出栈序列种数,即选择k这个序数的 f(n)=f(k-1)×f(n-k)。而k能够选1到n,因此再根据加法原理,将k取不一样值的序列种数相加,获得的总序列种数为:f(n)=f(0)f(n-1)+f(1)f(n-2)+……+f(n-1)f(0)。( f (0)==1 f(1)==1),因此此问题的求解式知足卡特兰数的原理的。it
4.卡特兰数的递推关系的解,即求出此问题不一样出栈顺序有多少。咱们用折现法来证实。io
事实上,能够认为问题是,任意两种操做(入栈和出栈),要求每种操做的总次数同样,且进行第k次出栈前必须先进行至少k次入栈。咱们假设一我的在原点,入栈是此人沿右上角45°走一个单位(一个单位设为根号2,这样他第一次进行操做1就恰好走到(1,1)点),出栈是此人沿右下角45°走一个单位。第k次出栈前必须先进行至少k次入栈,就是说明所走出来的折线不能跨越x轴走到y=-1这条线上!在进行n次入栈和n次出栈后,此人必将到到达(2n,0)!若无跨越x轴的限制,折线的种数将为 C(2n,n),即在2n次操做中选出n次做为入栈的方法数。class
如今只要减去跨越了x轴的状况数。对于任意跨越x轴的折线状况,必有将与y=-1相交的点。找出第一个与y=-1相交的点k,将k点以右的折线根据y=-1对称(即后面曲线的变化规律是反的可是数量上是保持一致的)。能够发现终点最终都会从(2n,0)对称到(2n,-2)(由于的坐标终点是固定的)。因为对称老是能进行的,且是可逆的。(即所求不一样折线的总数是同样的,等价的)咱们能够得出全部跨越了x轴的折线总数是与从(0,0)到(2n,-2)的折线总数数量相等。撇开k点后的实线折线图无论,虚线表示的其实就是入栈和出栈的总数是2n,而出栈的数量比入栈多了一次(没必要在乎其在文字上的合理性,咱们只是须要求出其值)那么出栈就出了n+1次,入栈就入了n-1次。因此其不一样折线数量为C(2n,n-1) or C (2n,n+1).原理
因此卡特兰数递推关系的解为f(n)=C(2n,n)-C(2n,n-1) or f(n)=C(2n,n)-C(2n,n+1)。
map