卡特兰数的数学解释和分析

关于卡特兰数,我也是最近才接触到,是在一份笔试的代码题里,题目大致是这样的:

   16个人去饼店买饼,其中8个人身上有5块钱,8个人身上有10块钱,饼5块钱一个,老板一开始没有零钱可找,问有多少种方案可以让每个人都买到饼。


一开始我也没想到(毕竟高中数学学得烂),后来百度之后百度到一个关键字——卡特兰数;

卡特兰数的问题和上面的类似,最典型的就是出入栈的问题,对于一个容量为2n的栈,n个入栈,n个出栈,有多少种合法的方案。

一开始我在很多人的博客里都看到了卡特兰数的通项公式,或者直接给了公式,很少人讲数学推导过程,直到我看到了一个递归公式。


这里我们把入栈操作看做1,出栈看做0,即1的个数必须大于0.

总共2n次操作,n次入栈,n次出栈,所以可以得出,总的操作方案数即是C(2n,n).

我们把1和0平铺, 即变成11011100.。。0这样的数列。对于所有合法的方案,假设,在第k位,这时1的数量和0的数量相等,由此可以得出,在k位之前,1的数量应该大于0 的数量,并且在k位之后,1的数量也应该大于0的数量,这样才能构成一个合法的序列。

那么,一个总的合法序列就应该所以k的可能位置之和,并且k的位置是对称的。即我们可以对一个合法序列进行分开统计,分成k前后两部分,然后对这两部分再分 ,即进行一次次递归,直到最小单位为止,然后再把所有的相加。

那么次数可以写成f(2n) = f(0)*f(n-1)+f(1)*f(n-2)+....+f(n-2)*f(1)+f(n-1)*f(0) ;

其中f(1)=1;那么可以得出f(0)=1;

用程序递归之后即可解得总数。


你可能感兴趣的:(学习笔记)