1. 程式人生 > >卡特蘭數簡單分析原理 為什麼可以求解出棧情況數 史上最簡單

卡特蘭數簡單分析原理 為什麼可以求解出棧情況數 史上最簡單

首先簡單看一下公式


公式就是若要求一個數,就把之前求出來的數,第一個乘以最後一個。

為什麼可以這樣就可以求出出棧情況數呢?

我們用遞迴的思想來看待。

這裡我們作一個假設。我們會把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)的整體。

可能有點抽象,原諒我的表述。