阿凡卢 发表于 2012-12-13 21:21:40

卡特兰数 catalan number

<div id="cnblogs_post_body">卡特兰数 catalan number
卡特兰数前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, ...
原理
令h(0)=1,h(1)=1,catalan数满足递推式:h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)   
例如:h(2)=h(0)*h(1)+h(1)*h(0)=1*1+1*1=2   h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=1*2+1*1+2*1=5   
另类递推式:       h(n)=h(n-1)*(4*n-2)/(n+1);   
递推关系的解为:   h(n)=C(2n,n)/(n+1) (n=0,1,2,3,...)   
递推关系的另类解为: h(n)=C(2n,n)-C(2n,n+1)(n=0,1,2,3,...)
<div class="cnblogs_code">//函数功能: 计算Catalan的第n项   //函数参数: n为项数   //返回值:   第n个Catalan数   int Catalan(int n){      if(n <= 1)          return 1;      int *h = new int 1]; //保存临时结果       h[0] = h[1] = 1;      //h(0)和h(1)       for(int i = 2; i <= n; i++)    //依次计算h(2),h(3)...h(n)       {          h = 0;          for(int j = 0; j < i; j++) //根据递归式计算 h(i)= h(0)*h(i-1)+h(1)*h(i-2) + ... + h(i-1)h(0)               h += (h * h1-j]);      }      int result = h; //保存结果       delete [] h;       //注意释放空间       return result;}
页: [1]
查看完整版本: 卡特兰数 catalan number