I00020 计算卡特兰数函数

卡特兰数是组合数学中的一个重要概念。

卡特兰数可以解决以下四种典型的问题:

1.括号化问题 矩阵链乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?(h(n)种)

2.出栈次序问题 一个无穷大堆栈的进栈序列为1,2,3,..n,有多少个不同的出栈序列?

3.凸多边形三角划分问题 将一个凸多边形区域分成三角形区域的方法数?

4.给定节点组成二叉树 给定N个节点,能构成多少种不同的二叉树?

卡特兰数递推式有各种形式。这里使用以下的递推式计算卡特兰数列的第n项。

c(n)=c(n-1)*(4*n-2)/(n+1);

程序中给出了递归和递推两种方法实现的计算卡特兰数的函数。

程序中使用unsigned long long类型定义变量,可以尽可能算出更大一些的卡特兰数。

程序如下:

/* 计算catalan数函数 */

#include <stdio.h>

unsigned long long catalannumber1(int n)
{
    if(n == 0)
        return 1;
    else
        return (4 * n - 2) * catalannumber1(n-1) / (n + 1);
}

unsigned long long catalannumber2(int n)
{
    unsigned long long cn = 1;
    int i;

    for(i=1; i<=n; i++)
        cn = (4 * i - 2) * cn / (i + 1);

    return cn;
}

int main(void)
{
    int i;

    for(i=0; i<=30; i++)
        printf("%d %lld %lld\n", i, catalannumber1(i), catalannumber2(i));

    return 0;
}

计算结果如下:

0 1 1
1 1 1
2 2 2
3 5 5
4 14 14
5 42 42
6 132 132
7 429 429
8 1430 1430
9 4862 4862
10 16796 16796
11 58786 58786
12 208012 208012
13 742900 742900
14 2674440 2674440
15 9694845 9694845
16 35357670 35357670
17 129644790 129644790
18 477638700 477638700
19 1767263190 1767263190
20 6564120420 6564120420
21 24466267020 24466267020
22 91482563640 91482563640
23 343059613650 343059613650
24 1289904147324 1289904147324
25 4861946401452 4861946401452
26 18367353072152 18367353072152
27 69533550916004 69533550916004
28 263747951750360 263747951750360
29 1002242216651368 1002242216651368
30 3814986502092304 3814986502092304


你可能感兴趣的:(卡特兰数,组合数学,趣味程序)