首先简单看一下公式
公式就是若要求一个数,就把之前求出来的数,第一个乘以最后一个。
为什么可以这样就可以求出出栈情况数呢?
我们用递归的思想来看待。
这里我们作一个假设。我们会把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)的整体。
可能有点抽象,原谅我的表述。