# 【資工考研】離散:遞迴關係式與其求解 ## Recurrence Relation 考慮數列 $a_0,a_1,\cdots ,a_n$ ,如果 $a_n$ 可以用之前的若干項表示,則稱此種表達式為遞迴關係式 ## 用數學歸納法證明 通常是題目給定了遞迴關係式,我們要證明該通解是正確的 例如知名的 Ackerman's function: $$\begin{cases} \mathrm{Ack}(0,n) =& n+1 \\ \mathrm{Ack}(m,0) =& \mathrm{Ack}(m-1,1), &m\gt 0 \\ \mathrm{Ack}(m,n) =& \mathrm{Ack}(m-1,\mathrm{Ack}(m,n-1)), &m,n\gt 0 \end{cases}$$ > Show $\forall n\in\mathbb{N}, \mathrm{Ack}(1,n) = n+2$. Sol: 當 $n = 0$ 時, $\mathrm{Ack}(1,0) = \mathrm{Ack}(0,1) = 1+1 = 2 = 0+2$ ,原式成立 設 $n = k\ge 0$ 時原式成立 則 $n = k+1$ 時, $\mathrm{Ack}(1,k+1) = \mathrm{Ack}(0,\mathrm{Ack}(1,k)) = \mathrm{Ack}(0,k+2) =k+3 = (k+1)+2$ 原式亦成立 故由數學歸納法知, $\forall n\in\mathbb{N}, \mathrm{Ack}(1,n) = n+2$ *** > Suppose that $a_{m,n}$ is defined recursively by $a_{m,n} = \begin{cases} 0 &\text{ if } n=0,m=0 \\ a_{m-1,n}+1 &\text{ if } n=0,m\gt 0 \\ a_{m,n-1}+n &\text{ if } n\gt 0 \end{cases}$. Show that $a_{m,n} = m+n(n+1)/2, \forall (m,n)\in\mathbb{N}\times\mathbb{N}$. Sol: 對 $\mathbb{N}\times\mathbb{N}$ 中所有有序對依[字典順序](https://hackmd.io/@RyoukiWei/binary-relation#Lexicographic-Ordering)排序,而對 $(m,n)$ 做歸納 當 $(m,n) = (0,0)$ 時, $a_{m,n} = a_{0,0} = 0 = 0+0(0+1)/2$ ,原式成立 假設排在 $(m,n)$ 前的有序對皆使題目敘述成立 則對 $(m,n)$, 如果 $n= 0$ 則因為 $(m-1, n)$ 排在 $(m,n)$ 前,故 $a_{m,n} = a_{m-1,n}+1 = m-1+n(n+1)/2+1 = m+n(n+1)/2$ ; 若 $n\gt 0$ 則因為 $(m,n-1)$ 排在 $(m,n)$ 前,故 $a_{m,n} = a_{m,n-1}+n = m+(n-1)n/2+n = m+n(n+1)/2$ 故由數學歸納法知, $a_{m,n} = m+n(n+1)/2, \forall (m,n)\in\mathbb{N}\times\mathbb{N}$ ## 代入求解大法 由規律性來求出整體通解,在解遞迴演算法的時間複雜度時,是相當常用的技巧 通常代個幾項就能看出規律了 例如: > $T(n) = 2T(n-1) + 1$, $T(1) = 1$ Sol: $$ \begin{equation} \begin{split} T(n) =& 2(2T(n-2)+1) + 1 \\ =& 2^2T(n-2) + 2 +1 \\ =& 2^{n-1}T(1)+ 2^{n-2}+\cdots +2+1 \\ =& 2^{n-1} + 2^{n-1} - 1 \\ =& \theta(2^n) \end{split} \end{equation} $$ > $T(n) = 2T(\frac{n}{2})+n$, $T(1) = 0$ Sol: $$ \begin{equation} \begin{split} T(n) =& 2^2T(\frac{n}{2^2}) + 2n \\ =& 2^kT(\frac{n}{2^k}) + kn \end{split} \end{equation} $$ Let $n = 2^k, k = \lg n$ $$ \therefore T(n) = n\lg n = \theta (n\lg n) $$ ## 特徵多項式 ### 齊次 + 相異特徵根 若有 $\alpha_1, \cdots \alpha_r$ 為相異特徵根,則通解 $a_n = c_1\alpha_1^n + \cdots +c_r\alpha_r^n$ 例如: > $a_n = 2a_{n-1} + 3_{n-2}, n\ge 2$, $a_0 = 1,a_1 = 1$ 特徵式: $\alpha^2 - 2\alpha -3 = 0$, $\alpha = 3$ or $-1$ Let $a_n = c_1 3^n + c_2 (-1)^n$ $$ \begin{cases} a_0 =& c_1 + c_2 &= 1 \\ a_1 =& 3c_1 - c_2 &= 1 \end{cases} $$ $$ \therefore c_1 = \frac{1}{2}, c_2 = \frac{1}{2} $$ $$ a_n = \frac{1}{2}\lbrack 3^n + (-1)^n \rbrack, n\ge 0 $$ ### 齊次 + 有重根 假設 $\alpha_1$ 解出有 $m_1$ 個,那就要修正成 $c_1\alpha_1^n + c_2 n\alpha_1^n + \cdots c_{m_1}n^{m_1-1}\alpha_1^n$ 這是為了防止同類項合併 例如: > $a_n-6a_{n-1}+9a_{n-2} = 0, n\ge 2$, $a_0=5,a_1=12$ 解出特徵根: $3, 3$ Let $a_n = c_1 3^n + c_2n3^n$ $$ \begin{cases} a_0 =& c_1 &= 5 \\ a_1 =& 3c_1 + 3c_2 &= 12 \end{cases} $$ $$ \therefore c_1 = 5, c_2 = -1 $$ $$ a_n = 5\cdot 3^n - n\cdot 3^n, n\ge 0 $$ ### 齊次 + 複數根 如果解出複數根如 $\alpha\pm\beta i$ ,則令 $a_n = \rho ^n (B_1 \cos\theta + B_2\sin\theta)$ ,其中 $\rho = \sqrt{\alpha^2 + \beta^2}$ 、$\cos\theta = \frac{\alpha}{\rho}, \sin\theta = \frac{\beta}{\rho}$ 例如: > $a_n + 2a_{n-1} + 2a_{n-2} = 0, n\ge 2$, $a_0=a_1=1$ 解出特徵根為 $-1\pm i$ Let $a_n = (\sqrt{2})^n(B_1\cos\frac{3n\pi}{4} + B_2\sin\frac{3n\pi}{4})$ $$ \begin{cases} a_0 =& B_1 &= 1 \\ a_1 =& \sqrt{2}(\frac{-B_1}{\sqrt{2}} + \frac{B_2}{\sqrt{2}}) &= 1 \end{cases} $$ $$ \therefore B_1 = 1, B_2 = 2 $$ $$ a_n = (\sqrt{2})^n(\cos\frac{3n\pi}{4} + 2\sin\frac{3n\pi}{4}), n\ge 0 $$ ### $k$ 階常係數線性非齊次 如果題目是長 $a_n + c_1a_{n-1} + \cdots c_ka_{n-k} = f(n), c_k\neq 0$ 則通解 $a_n = a_n^{(h)} + a_n^{(p)}$ ,其中 $a_n^{(h)}$ 叫齊次解、 $a_n^{(p)}$ 為特殊解 $a_n^{(h)}$ 就是我們不看 $f(n)$ 把原式當齊次式,用上面的方法解出來的解 $a_n^{(p)}$ 則要看 $f(n)$ 的長相,求出 $a_n^{(p)}$ 的模樣後代回原式以解出其係數 |$f(n)$ 長相|$a_n^{(p)}$| 修正之注意事項 | |:--:|:---:| :---: | | $t$ 次多項式 | $d_0 + d_1n + \cdots d_tn^t$ | 若有 $s$ 個特徵根為 $1$ ,修正為 $(d_0 + d_1n + \cdots d_tn^t)\cdot n^s$ | | 以 $b$ 為底的指數 | $d_0\cdot b^n$ | 若有 $s$ 個特徵根為 $b$ ,修正為 $(d_0\cdot b^n)\cdot n^s$ | | 三角函數 | $d_0\cos n\theta + d_1\sin n\theta$ | | | 上述情況之線性組合 | 上述之線性組合 | (遵照上面) | 這邊的修正也是防止同類項合併 例如: > $a_n = 4a_{n-1}-3a_{n-2}+4, n\ge 3$, $a_1=-9,a_2=-5$ 特徵根求出為 $1, 3$ 齊次解令為 $a_n^{(h)} = c_1 1^n + c_2 3^n$ 特殊解令為 $a_n^{(p)} = d_0 n$ (因為特徵根有 $1$) ,代回原式: $$ d_0n - 4d_0(n-1) + 3d_0(n-2) = 4, d_0 = -2 $$ 故 $a_n = c_1 1^n + c_2 3^n - 2n$ $$ \begin{cases} a_1 =& c_1 + 3c_2 - 2 &= -9 \\ a_2 =& c_1 + 9c_2 - 4 &= -5 \end{cases} $$ $$ \therefore c_1 = -10, c_2 = 1 $$ $$ a_n = -10 + 3^n - 2n, n\ge 1 $$ *** > $a_n = a_{n-1} + 2a_{n-2} + (-1)^n, n\ge 2$, $a_0=a_1=1$ 特徵根為 $2,-1$ $a_n^{(p)} = d_0 (-1)^n n$ (因為有特徵根與 $f(n)$ 之底數相同) $d_0$ 代回原式求出是 $\frac{1}{3}$ 故 $a_n = c_1 2^n + c_2 (-1)^n + \frac{1}{3}n(-1)^n$ 解出 $c_1 = \frac{7}{9}, c_2 = \frac{2}{9}$ ## 生成函數 常見的一般生成函數要熟悉,例如 $\frac{1}{1-x} = \sum\limits_{i=0}^{\infty}x^i, \left| x \right|\lt 1$ $(1+x)^{-n} = \sum\limits_{r=0}^{\infty}\binom{-n}{r}x^r = \sum\limits_{r=0}^{\infty}(-1)^r\binom{n+r-1}{r}x^r$ 一般來說,用生成函數解很佔計算空間,通常都是題目要求你要用生成函數解題才用,不然就用其他方法快速解 用生成函數算可能會出包,所以建議先用特徵方程之類的方法求出答案,再用生成函數寫計算過程,最後看看有沒有計算錯誤 例如: > $a_{n+2}-8a_{n+1}+15a_n = 0, n\ge 0$, $a_0=1,a_1=6$ 我們先偷算答案到底是多少 首先不難看出特徵根是 $3, 5$ $$ \begin{cases} a_0 =& c_1 + c_2 &= 1 \\ a_1 =& 3c_1 + 5c_2 &= 6 \end{cases} $$ 所以我們搶先算出了 $a_n = \frac{1}{2}(-3^n + 3\cdot 5^n), n\ge 0$ 我們這樣只需要花幾秒鐘 接著才是用生成函數開始計算,首先我們要把原式變成 $\sum\limits_{n=?}^{\infty}a_n x^n$ 的模樣 原式是 $a_{n+2}-8a_{n+1}+15a_n = 0$ 所以寫成 $\sum\limits_{n=0}^{\infty}a_{n+2}\cdot x^n -8\cdot \sum\limits_{n=0}^{\infty}a_{n+1}\cdot x^n + 15\cdot \sum\limits_{n=0}^{\infty}a_{n}\cdot x^n = 0$ 可以看到係數的部分還沒都是 $a_n$,接著我們要對 $\sum$ 的 index 動手腳 使得每個係數都能寫成 $a_n$ 的模樣: $$ \begin{equation} \begin{split} &\sum\limits_{n=0}^{\infty}a_{n+2}\cdot x^n -8\cdot \sum\limits_{n=0}^{\infty}a_{n+1}\cdot x^n + 15\cdot \sum\limits_{n=0}^{\infty}a_{n}\cdot x^n = 0 \\ \Rightarrow &\sum\limits_{n=2}^{\infty}a_{n}\cdot x^n -8\cdot \sum\limits_{n=2}^{\infty}a_{n-1}\cdot x^n + 15\cdot \sum\limits_{n=2}^{\infty}a_{n-2}\cdot x^n = 0 \\ \Rightarrow &\sum\limits_{n=2}^{\infty}a_{n}\cdot x^n -8x\cdot \sum\limits_{n=1}^{\infty}a_{n}\cdot x^n + 15x^2\cdot \sum\limits_{n=0}^{\infty}a_{n}\cdot x^n = 0 \\ \Rightarrow &(1-8x+15x^2)\sum\limits_{n=0}^{\infty}a_{n}\cdot x^n - (a_0\cdot x^0 + a_1\cdot x^1) - (-8x\cdot a_0\cdot x^0) = 0 \\ \Rightarrow &\sum\limits_{n=0}^{\infty}a_{n}\cdot x^n = \frac{(1-2x)}{(1-8x+15x^2)} = \frac{-\frac{1}{2}}{1-3x} + \frac{\frac{3}{2}}{1-5x} \text{ (把 } a_0 \text{ 跟 } a_1 \text{ 的值代入,轉成熟悉的生成函數)} \\ \Rightarrow &\sum\limits_{n=0}^{\infty}a_{n}\cdot x^n = \frac{1}{2}\lbrack -\sum\limits_{i=0}^{\infty}(3x)^i + 3\sum\limits_{i=0}^{\infty} (5x)^i\rbrack \end{split} \end{equation} $$ 比對等號左右兩邊的係數,便可得 $a_n = \frac{1}{2}(-3^n + 3\cdot 5^n), n\ge 0$ 回去看一下事先算好的答案,我們算對了 可以看到,生成函數的算法很考驗你的細心,還有熟不熟悉生成函數 基本上是建議可以直接把原式寫成 $a_n-8a_{n-1}+15a_{n-2} = 0$ 然後就能跳到上面計算過程的第二步: $\sum\limits_{n=2}^{\infty}a_{n}\cdot x^n -8\cdot \sum\limits_{n=2}^{\infty}a_{n-1}\cdot x^n + 15\cdot \sum\limits_{n=2}^{\infty}a_{n-2}\cdot x^n = 0$ 省一步思考的功夫,其實會輕鬆一點 *** > 將 $n$ 個自然數 $1,2,\cdots ,n$ 排列使得 $k$ 不在第 $k$ 位 (亂序排列, Derangement) ,令其方法數為 $D_n$ 則 (1) > $D_n = (n-1)(D_{n-1}+D_{n-2}), \forall n\ge 3$, $D_1=0,D_2 = 1$ 考慮任一數 $i$ ($1\le i\le n$) 放置到位置 $j$ ($i\neq j$) 則 $D_n$ 可以分成兩種情況: 1. $j$ 放到位置 $i$ 2. $j$ 不放到位置 $i$ 以 1. 來說,代表我們只需要考慮剩下 $n-2$ 個數的亂序方法數,即 $D_{n-2}$ 至於 2. 的情況,我們就需要考慮 $n-1$ 個數亂序的方法數,即 $D_{n-1}$ 而對於數字 $i$ 總共有 $n-1$ 種 $j$ 可以選擇,故 $D_n = (n-1)(D_{n-1}+D_{n-2}), n\ge 3$ 只有一個數字沒得亂序,故 $D_1 = 0$ ;兩個數字之亂序只會是兩數交換位置,故 $D_2 = 1$ (2) > Let $f(x) = \sum\limits_{n=0}^{\infty}\frac{D_nx^n}{n!}$, then $f(x) = \frac{e^{-x}}{1-x}$ 根據 $D_n = (n-1)(D_{n-1}+D_{n-2})$ 得 $D_n - nD_{n-1} = (-1)\lbrack D_{n-1}-(n-1)D_{n-2}\rbrack = (-1)^{n-2}(D_2-2D_1) = (-1)^{n-2} = (-1)^n$ (用代入大法) 接著我們對上式使用生成函數法解題: $$ D_n - nD_{n-1} = (-1)^n $$ $$ \begin{equation} \begin{split} &\sum\limits_{n=1}^{\infty}\frac{D_n}{n!}x^n - n\cdot \sum\limits_{n=1}^{\infty}\frac{D_{n-1}}{n!}x^n = \sum\limits_{n=1}^{\infty}\frac{(-1)^n}{n!}x^n \\ \Rightarrow &\sum\limits_{n=1}^{\infty}\frac{D_n}{n!}x^n - x\cdot \sum\limits_{n=0}^{\infty}\frac{D_{n}}{n!}x^n = \sum\limits_{n=1}^{\infty}\frac{(-1)^n}{n!}x^n \\ \Rightarrow &(f(x) - D_0) - x\cdot f(x) = e^{-x} - 1 \\ \Rightarrow &f(x) = \frac{e^{-x} - 1 + D_0}{1-x} = \frac{e^{-x}}{1-x} \end{split} \end{equation} $$ (3) $D_n$ 通解? $$ \begin{equation} \begin{split} f(x) &= \sum\limits_{n=0}^{\infty}\frac{D_nx^n}{n!} = \frac{e^{-x}}{1-x} \\ &= (1-\frac{x}{1!}+\frac{x^2}{2!}-\frac{x^3}{3!}+\cdots)(1+x+x^2+x^3+\cdots) \\ &=\sum\limits_{n=0}^{\infty}\left( 1-\frac{1}{1!}+\frac{1}{2!}-\frac{1}{3!}+\cdots +\frac{(-1)^n}{n!} \right)x^n \\ \therefore D_n &= n!\left( 1-\frac{1}{1!}+\frac{1}{2!}-\frac{1}{3!}+\cdots +\frac{(-1)^n}{n!} \right) \end{split} \end{equation} $$ ## 應用問題 1. The Tower of Hanoi ($a_n = 2^n-1$ for 3-tower) 2. 含偶數個 $0$ 的字串 3. 連 $0$ 的字串 字串型的問題,其實就是討論子字串開頭會是誰,進而構建出遞迴關係式 剩下就簡單了 子字串從原始字串開始討論 雖然看似純幹話,但遞迴應用問題基本上你想辦法構建出遞迴關係式,答案便呼之欲出了 通常就是你總覺得這問題有個模式可以重複遵循 解演算法的 DP 也是這樣子想出遞迴關係式的 ## Catalan Number 我們很多東西的答案是 Catalan number ,例如 $n$ 節點的相異 binary tree 有 $C_n$ 種,即第 $n$ 個 Catalan number 我在[LeetCode 96. Unique Binary Search Trees](https://hackmd.io/@RyoukiWei/leetcode96?stext=697%3A276%3A0%3A1738526863%3ArgxPui) 有講過要怎麼想出遞迴關係式,不過我沒有說明 Catalan number 怎麼從遞迴關係式解出通解 其實呢,我們可以生成函數來解 這邊留給讀者思考怎麼求 至於各種姿勢的 Catalan number 證法可以參考[wiki](https://en.wikipedia.org/wiki/Catalan_number#Proof_of_the_formula) ## Fibonacci Number 費氏數,老朋友了吧,用特徵函數能求出 $F_n = \frac{1}{\sqrt{5}}\left( \left( \frac{1+\sqrt{5}}{2} \right)^n - \left( \frac{1-\sqrt{5}}{2} \right)^n \right)$ 這數字應該要很熟悉了 其中 $\frac{1+\sqrt{5}}{2}$ 就是大名鼎鼎的黃金比例 ($\varphi$) $$ \varphi^n = F_{n-1} + \varphi F_n $$ 有些題目呢,看起來無關但其實就是費氏數 例如著名的[爬樓梯問題(LeetCode 上有一題,你可以點開此連結來寫)](https://leetcode.com/problems/climbing-stairs/description/) > You are climbing a staircase. It takes $n$ steps to reach the top. > > Each time you can either climb $1$ or $2$ steps. In how many distinct ways can you climb to the top? 設有 $a_n$ 種走法 分兩種情況討論: 1. 第一步走 $1$ 階樓梯:有 $a_{n-1}$ 種方式 2. 第二步走 $2$ 階樓梯:有 $a_{n-2}$ 種方式 故 $a_n = a_{n-1} + a_{n-2}, n\ge 3$, $a_1=1,a_2=2$ 這不就老朋友嗎? 剩下不用我解了吧