斐波那契数列、卡特兰数

文章介绍了斐波那契数列的矩阵快速幂计算方法和卡特兰数的递推及通项公式,重点讨论了卡特兰数在解决进出栈问题中的应用,阐述了如何利用卡特兰数解决不同出栈序列的数量计算,并提及该问题的其他变种,如购物排队问题。
摘要由CSDN通过智能技术生成

一、斐波那契数列(兔子序列)

1, 1, 2, 3, 5, 8, 13, 21, ...

递推公式:f(1)=f(2)=1; f(n)=f(n-1)+f(n-2) (n>=3)

快速求f(n):矩阵快速幂(logn)

二、卡特兰数

1, 2, 5, 14, 42, 132, 429, 1430, 4862, ...

递推公式:h(0)=1, h(1)=1; h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)

通项公式:h(n)=\frac{1}{n+1}\binom{n}{2n}

应用:

进出栈问题栈是一种先进后出(FILO,First In Last Out)的数据结构.如下图1,1,2,3,4顺序进栈,那么一种可能的进出栈顺序是:1In→2In→2Out→3In→4In→4Out→3Out→1Out, 于是出栈序列为1,3,4,2

                                        

那么一个足够大的栈的进栈序列为1,2,3,⋯,n时有多少个不同的出栈序列?

            我们可以这样想,假设k是最后一个出栈的数。比k早进栈且早出栈的有k-1个数,一共有h(k-1)种方案。比k晚进栈且早出栈的有n-k个数,一共有h(n-k)种方案。所以一共有h(k-1)*h(n-k)种方案。显而易见,k取不同值时,产生的出栈序列是相互独立的,所以结果可以累加。k的取值范围为1至n,所以结果就为h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0)。

            出栈入栈问题有许多的变种,比如n个人拿5元、n个人拿10元买物品,物品5元,老板没零钱。问有几种排队方式。熟悉栈的同学很容易就能把这个问题转换为栈。值得注意的是,由于每个拿5元的人排队的次序不是固定的,所以最后求得的答案要*n!。拿10元的人同理,所以还要*n!。所以这种变种的最后答案为h(n)*n!*n!。

参考:

斐波那契数列_IronWring_Fly的博客-CSDN博客

卡特兰数详讲_wookaikaiko的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值