卡特兰数简单分析原理 为什么可以求解出栈情况数 史上最简单

首先简单看一下公式


公式就是若要求一个数,就把之前求出来的数,第一个乘以最后一个。


为什么可以这样就可以求出出栈情况数呢?

我们用递归的思想来看待。

这里我们作一个假设。我们会把n个数分成两部分来处理。就是必须等第一部分处理(栈内全部排空)完后,第二部分的数才能入栈,才能被处理。

那样我们就很容易写公式了,那如果1和n-1是独立的两部分。公式就是f(1)*f(n-1)

如果2和n-2是独立的两部分。公式就是f(2)*f(n-2)了

以此类推,就最终可以推到f(n-1)*f(1)

和我们的卡特蓝数的递推公式不谋而合。


有些人可能很奇怪,为什么可以这样思考?他可能会举这样一个反例,我们就不分开来处理,让栈一直保持不为空的状态,这样我是不是就无话可说了?

其实我想说,这样一种情况,不就是把n个数作为一个整体,0个数作为另一个整体吗?所以你的公式是这样的f(0)*f(n) f(0)我们显然可以知道是1。

其实让你求f(n)就是让你求f(n)*f(0)的意思。

所以我敢说,这样思考,绝对绝对可以涵盖所有的情况。


以上思想我没借鉴任何别人的证明,只借鉴了一个卡特蓝数的递推公式,都是我个人劳动成果。所以要用的话,客官希望可以注明一下出处。。。


补充一下:栈一直不为空的情况下,确实是f(n)*f(0),有人会觉得很奇怪。其实这确实是错的。我讲一下错误原因,因为卡特蓝数是这样的: 1, 1, 2, 5, 14, 42, 132, 429。

但是我们出栈情况数是这样的,1,2,5前面少了一个1!所以我们在前面的基础上还需要重新审视一下这个题目。

所以我们的出栈情况数的f(3)是这样算的。

f(3=4-1)=f(1)f(3) + f(2)f(2) + f(3)f(1) = 5;

所以我们算的时候,求f(3)其实就是求f(4)。

所以我们求n辆火车的时候,按照公式来,我们就是在求f(n+1),所以也就不奇怪栈一直不为空的时候,是f(n)*f(0)了


下面我列举一下

n辆火车数的出栈情况数 =  f(n+1)=f(1)*f(n) + f(2)*f(n-1) +...+f(n)*f(1)


所以栈一直不为空的时候,f(n)是一个整体,f(1)是一个整体,虽然没有体现出来,但是就算当你默认n个数是一个整体的时候,你默认也会内置一个f(1)的整体。


可能有点抽象,原谅我的表述。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值