第一章 遞迴問題 學習筆記

Martian148發表於2024-06-18

河內塔問題

image.png|659

\(3\) 根柱子和 \(n\) 個圓盤,我們可以把最頂上的圓盤移到另外的柱子上,但不可以把大的圓盤放在小的圓盤上面

問,最少需要多少步才能把所有圓盤從一根柱子移到另外一跟柱子上

我們先命名一個狀態 \(T_n\) 表示圓盤從一根柱子移動到另外一根柱子的最少次數

那麼我們思考一種移動方案,假設我們要把圓盤從 \(A\) 柱移動到 \(B\) 柱上

那麼我們可以將 \(n-1\) 個圓盤移動 \(C\) 柱上 然後把最下面的圓盤移動到 \(B\) 柱上,最後把 \(n-1\) 個圓盤從 \(C\) 柱移到 \(B\) 柱,所以,我們能得到方程

\[\begin{align*} &T=1 \\ &T_n= 2T_{n-1}+1 (n >0) \end{align*}\]

我們想要得到通項公式,可以盲猜結論 \(T_n = 2^n -1,n \ge 0\)

可以用數學歸納法證明

  • \(n=1\) 時等式成立
  • \(n\ge 1\)時,假設 \(T_{n-1} = 2^{n-1}-1\) 成立,可得

\[T_n=2T_{n-1}+1=2 \times (2^{n-1}-1)+1=2^n-1 \]

證畢

平面上的直線

平面上 \(n\) 條直線所界定的區域最大個數 \(L_n\) 是多少

image.png

我們考慮假設已經有\(n-1\) 條直線,我們需要畫一條直線,這條直線最多和 \(n-1\) 條直線相交產生 \(n\) 個新的區域
image.png
所以我們得到了

\[\begin{align*} &L_0=1 \\ &L_n=L_{n-1}+n (n >0) \end{align*}\]

很容易我們可以得出 \(L_n=\frac{n(n+1)}{2}+1,n \ge0\)

考慮一個變形,平面上由 \(n\) 條這樣的折線所界定區域的最大的個數 \(Z_n\) 是多少

image.png

考慮一個折線可以看作兩條直線擦掉一半,對於每個折線,我們都失去了 \(2\) 塊區域

image.png

所以

\[\begin{aligned} Z_n & = L_{2n}-2n \\ & = \frac{2n(2n+1)}{2}+1-2n\\ & = 2n^2-n+1,n \ge 0 \end{aligned}\]

約瑟夫問題

從圍成標有記號的 \(1\)\(n\)\(n\) 個人開始,每隔一個刪去一個人,直到有一個人倖存下來

image.png

\(n=10\) 時,消去的人時 \(2,4,6,8,10,7,1,9\) 最後 \(5\) 倖存

我們由此能得到幾個規律:

  • 每一輪殺人,殺一半,向下取整,偶數編號的人會被殺
  • 倖存的人,重新編號

遞迴表示式

每輪殺人,編號減半,那麼最後肯定剩下一個人,我們能不能從第 \(k\) 輪活下來的那個人的編號反推出第 \(k-1\) 輪活下來的那個人的編號呢?

\(n\) 個人時的倖存的號碼為 \(J(n)\)

  • 先考慮偶數的情況,第一圈把偶數的去掉,奇數留下來,假設一開始有 \(2n\) 個人,第一輪後就是
    image.png
    所以我們得到了一個子問題,用遞迴的思想,假設子問題以及求解完成了,我們可以得到表示式 \(J(2n)=2J(n)-1,n\ge1\),也就是說,存活的那個人的編號是子問題的答案的編號的兩倍減一

  • 然後考慮奇數,對於 \(2n+1\) 個人
    image.png
    我們得到 \(J(2n+1)=2J(n)+1\)

所以我們得到了表示式

\[\begin{align*} J(1)&=1 \\ J(2n)&=2J(n)-1,n\ge 1\\ J(2n+1)&=2J(n)+1,n\ge 1 \end{align*}\]

我們透過這個式子就可以快速得到答案了

接下來嘗試把遞迴式子轉化為非遞迴的形式

二進位制形式性質

有了遞迴式,我們能做出一張表:

image.png

顯然可以看出,\(J(n)\) 按照 \(2^m\) 為分段,段內為一個等差數列,於是我們能寫出 \(J(n)\) 的封閉形式,設 \(n=2^m+l\),則:

\[J(2^m+l)=2l+1,\ m\ge 0,\ 0\le l<2 \]

我們把 \(n\) 轉化成二進位制會發現更多規律,不妨設 \(n=(b_mb_{m-1}\cdots b_1b_0)\)

由於首位字母 \(b_m\) 必為 \(1\),所以 \(n=(1b_{m-1}\cdots b_1b_0)\),那麼 \(l=(b_{m-1}\cdots b_1b_0)\)

所以 \(J(n)=2l+1=(b_{m-1}b_{m-2}\cdots b_01)=(b_{m-1}b_{m-2}\cdots b_0b_m)\)

用計算機程式設計的行話說就是,\(n\) 向左迴圈移動一位就得到 \(J(n)\)

成套方法

我們嘗試把 \(J\) 函式進行擴充,有一個類似於 \(J\) 的遞迴式,引入常數 \(\alpha\)

\[\begin{align*} f(1)&=\alpha \\ f(2n)&=2f(n)+ \beta ,n\ge 1\\ f(2n+1)&=2f(n)+\gamma ,n\ge 1\\ \end{align*}\]

我們可以構造出如下表:

image.png|243

可以觀察出 \(\alpha\) 的係數是不超過 \(n\)\(2\) 的最大冪,\(\beta\) 的係數遞減 \(1\)\(\gamma\) 的係數遞增 \(1\)

我們可以得到 \(f(n)\) 的封閉形式:

\[f(n)=A(n)\alpha+B(n)\beta+C(n)\gamma \]

且我們觀察出

\[\begin{align*} A(n) &= 2^m \\ B(n) &=2^m-1-l \\ C(n) &=l \\ \end{align*}\]

這裡可以使用數學歸納法證明,但是也可以採用特殊值法來證明,書上把這種方法稱為成套方法

由於 \(A(n),B(n),C(n)\) 的關係在任何情況下都是固定的,所以理論上來說 \(\alpha,\beta,\gamma\) 可以取任意值

不妨取 \((\alpha,\beta,\gamma)=(1,0,0)\)\(f(n)=A(n)\),由:

\[\begin{align*} f(1)&=1 \\ f(2n)&=2f(n),n\ge 1 \\ f(2n+1)&=2f(n),n\ge 1 \\ \end{align*}\]

很顯然可以得到 \(A(n)=f(n)=2^m\)

我們還可以設 \(f(n)=1\),有:

\[\begin{align*} 1&=\alpha \\ 1&=2\times 1+\beta \\ 1&=2\times1 + \gamma \end{align*}\]

解出來得到 \((\alpha,\beta,\gamma)=(1,-1,-1)\),於是得到了一個關係式 \(1=A(n)-B(n)-C(n)\)

然後設 \(f(n)=n\),有:

\[\begin{align*} 1&=\alpha \\ 2n&=2n+\beta \\ 2n+1&=2n+\gamma \end{align*}\]

解出來得到 \((\alpha,\beta,\gamma)=(1,0,1)\),於是得到了一個關係式 \(n=A(n)+C(n)\)

聯立三個式子:

\[\begin{align*} 1&=A(n)-B(n)-C(n) \\ n&=A(n)+C(n) \\ A(n)&=2^m \end{align*}\]

於是 \(B(n)=2^m-1-l,C(n)=l\) 就可以被解出來了,這就是成套方法

有多少個獨立的引數,我們就需要多少個特殊的值,本題中有三個 \((\alpha,\beta,\gamma)\)

推廣的約瑟夫遞迴式

前面我們得到了一個二進位制下迴圈移位的性質,那麼推廣的約瑟夫表示式是否也有類似的性質呢?

推廣的遞迴式的形式如下:

\[\begin{aligned} f(1)&=\alpha \\ f(2n+j)&=2f(n)+\beta_j\ ,\ j=0,1\ ,n\ge 1 \\ \end{aligned} \]

展開就是

\[\begin{align*} f((b_m b_{m-1} \dots b_0)_2) =& 2f((b_m b_{m-1} \dots b_2)_2) + \beta_{b_0} \\ =& 4f((b_m b_{m-1} \dots b_2)_2) + 2\beta_{b_1} + \beta_{b_0} \\ \vdots \\ =& 2^m f((b_m)_2) + 2^{m-1} \beta_{b_{m-1}} + \cdots + 2\beta_{b_1} + \beta_{b_0} \\ = &2^m \alpha + 2^{m-1} \beta_{b_{m-1}} + \cdots + 2\beta_{b_1} + \beta_{b_0}. \end{align*} \]

所以我們可以解除二進位制的限制,這裡的 \(b_i\) 一點是 \(0,1\) ,但 \(\beta_j\) 可以不為 \(0,1\)

\[f\left((b_m b_{m-1} \cdots b_1 b_0)_2\right) = (\alpha \beta_{b_m-1} \beta_{b_{m-2}} \cdots \beta_{b_1} \beta_{b_0})_2. \]

我們把上面的表格換一種形式就可以看出

image.png|260

完全符合上面的形式,這裡的 \(\beta = \beta_0, \alpha = \gamma\)

於是,我們可以考慮推廣基數,這裡我們設基數為 \(d\)

\[\begin{aligned} f(j) &= \alpha_j, \quad 1 \leq j < d; \\ f(dn + j) &= c f(n) + \beta_j, \quad 0 \leq j < d, \quad n \geq 1 \end{aligned} \]

這個的解是:

\[f\left((b_m b_{m-1} \cdots b_1 b_0)_d\right) = (\alpha_{b_m} \beta_{b_{m-1}} \beta_{b_{m-2}} \cdots \beta_{b_1} \beta_{b_0})_c \]

例如,我們有遞迴式:

\[\begin{aligned} f(1) &= 34; \\ f(2) &= 5; \\ f(3n) &= 10f(n) + 76, \quad n \geq 1; \\ f(3n + 1) &= 10f(n) - 2, \quad n \geq 1; \\ f(3n + 2) &= 10f(n) + 8, \quad n \geq 1; \end{aligned} \]

假設我們這裡要計算 \(f(19)\),有 \(d=3\)\(c=10\) ,我們可以把 \(19\) 轉化成三進位制 \((201)_3\) ,這裡的 \(\alpha_1=2,\beta_0=76,beta_1=-2\),所以 \(f(19)=f((201)_3)=(5\ 76\ -2)_{10}=500 + 760 - 2 = 1258\)

相關文章