以出栈为例对卡特兰数进行推导及代码实现

以出栈为例对卡特兰数进行推导及代码实现

以出栈对卡特兰数推导

首先,假设一个n个元素的栈,他的出栈序列的个数为f(n);最后一个出栈的元素是第k个,
由于k是最后一个出栈的,因此:
k之前入栈的元素,必须在k入栈之前全部出栈,这样的元素一共有k-1个,序列个数也就是f(k-1);
k之后入栈的元素,会在k出栈之前全部出栈,这样的元素一共有n-k个,序列个数也就是f(n-k);
这两种情况相互独立,因此在最后一个元素是第k个的情况下,一个n个元素的栈的出栈序列个数为f(k-1)*f(n-k)
而k可以是1-n当中的任何一个,把所有可能的k对应的出栈序列个数相加就是得到的f(n),即:
f(n) =f(0)f(n-1)+f(1)f(n-2)+f(2)f(n-3)+…f(n-1)f(0)
而对于这样的一个递推关系式子就是卡特兰数。
可以写成 f ( n ) = ∑ i = 1 n f ( i − 1 ) f ( n − i ) f(n) = \sum_{i=1}^nf(i-1)f(n-i) f(n)=i=1nf(i1)f(ni)
这个递推关系的解为 f ( n ) = 1 n + 1 C 2 n n f(n) = \frac{1}{n+1}C^n_{2n} f(n)=n+11C2nn

对卡特兰数代码实现(C++)

#include <iostream>
using namespace std;
int catalan(int n) {

    if (n == 1)return 1;
    if (n == 2)return 1;
    int res = 0;
    for (int i = 1; i <= n - 1; i++) {
        res += catalan(i) * catalan(n - i);
    }
    return res;

}
int main() {
    int n;
    while (cin >> n) {

        cout << catalan(n) << endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值