# Chapter5 - 歸納與遞迴 Induction & Recursion ## 數學歸納法 M.I. > **前情提要** : 假設我們有一個無限高度的梯子,並且我們知道以下兩件事 : > 1. 我們可以爬到梯子的第一階 > 2. 如果我們可以爬到梯子的某一階,那我們就能爬到下一階 > > **我們能否得到結論 : 我們可以爬到梯子的每一階** * 說明 : * 數學歸納法只能證明已其他方式得到的結果,它並非發現公式或定理的工具 * 數學歸納法是一個強大又嚴謹的計數,用以證明命題函數 $P(n)$ 對每個自然數 $n$ 皆成立,無論 $n$ 值多大 * 定理 : 假設每個正整數 $n$ 都有一個命題 $P(n)$ * 基本步驟 : $P(1)$ 為真 * 歸納步驟 : 若 $P(k)$ 為真(**歸納假設**),則對於所有正整數 $k$ 來說, $P(k+1)$ 為真 * 因此對於每個正整數 $n$ 來說 $P(n)$ 為真 * 證明求和公式 : 證明若 $n$ 為正整數,則 $1+2+ \cdots + n = n(n+1)/2$ * 基本步驟 : 當 $n = 1$ 時,命題為真,因為 $1 = 1(1+1)/2$ * 歸納步驟 : 假設 $n = k \Rightarrow 1+2+ \cdots +k = k(k+1) / 2$ 為真 當 $n = k+1$ 時, $1+2+ \cdots +k+(k+1) = k(k+1)/2 + (k+1) = [k(k+1) + 2(k+1)]/2 = (k^2 + 3k + 2)/2 = (k+1)(k+2)/2$ 最後一個等號證明,當 $n = k+1$ 時命題也成立 我們完成了基本步驟和遞迴步驟,因此根據數學歸納法,我們證明出 若 $n$ 為正整數,則 $1+2+ \cdots + n = n(n+1)/2$ * 證明不等式 : 證明不等式 $n > 2^n$,$n$ 為正整數 令 $P(n)$ 為命題 $n < 2^n$ * 基本步驟 : $P(1)$ 為真,因為 $1 < 2^1 = 2$ * 歸納步驟 : 設 $P(k)$ 為真( $k$ 為正整數),因此 $k < 2^k$。我們需要證明 $P(k+1)$ 為真 : $k+1 < 2^{k+1}$ : $k+1 < 2^k+1 ≦ 2^k + 2^k = 2^{k+1}$ 我們證明了基於 $P(k)$ 為真的情況下, $P(k+1)$ (也就是 $k+1 < 2^{k+1}$)為真。遞迴步驟已完成。因此根據數學歸納法,$n > 2^n$ ($n$ 為正整數)得證 * 證明整除規則 : 證明 $n^3 - n$ 可被3整除,$n$ 為正整數 令 $P(n)$ 為命題$n^3 - n$ 可被3整除 * 基本步驟 : $P(1)$ 為真,因為 $1^3-1=0$ 可被3整除 * 歸納步驟 : 設 $P(k)$ 為真,因此 $k^3 - k$ 可被3整除。我們需要證明 $P(k+1)$ 為真 : $(k+1)^3 - (k+1) = (k^3 + 3k^2 + 3k + 1) - (k + 1) = (k^3 - k) + 3(k^2 + k)$ 因為 $k^3 - k$ 和 $3(k^2 + k)$ 都可被3整除,因此 $(k^3 - k) + 3(k^2 + k)$ 亦可被3整除。所以根據數學歸納法 $n^3 - n$ 可被3整除 ($n$ 為正整數)得證 * 證明集合論定理 : 證明若 $S$ 為一有 $n$ 個元素的有限集合( $n$ 為非負整數),則 $S$ 有 $2^n$ 個子集合 令 $P(n)$ 為命題一個有 $n$ 個元素的集合,擁有 $2^n$ 個子集合 * 基本步驟 : $P(0)$ 為真,因為0個元素的集合為空集合,只有 $2^0 = 1$ 個子集合 * 歸納步驟 : 設 $P(k)$ 為真(對於任意非負整數 $k$ 而言),因此有 $k$ 個元素的集合擁有 $2^k$ 個子集合。我們需要證明 $P(k+1)$ 為真 : 有 $k+1$ 個元素的集合擁有 $2^{2k+1}$ 個子集合 令 $T$ 為有 $K+1$ 個元素的集合,且 $S = T - \{ a \}$ (從 $T$ 中提取一個元素,使 $S$ 長度為 $k$)。對於 $S$ 的每個子集合 $X$,有兩個會對應到 $T$ 的子集合,一個是 $X$ (不含 $a$),另一個是 $X \cup a$ (含 $a$)。這樣每個 $X$ 都產生兩個不同的 $T$ 的子集合,而且不會重複,也不會漏掉任何可能(因為每個 $T$ 的子集合不是含 $a$ 就是不含 $a$)。由於 $S$ 有 $2^k$ 個子集合,而每個 $X$ 對應兩個 $T$ 的子集合,所以 $T$ 一共有 $2 \cdot 2^k = 2^{k+1}$ 個子集合,得證 * 數學歸納法的證明錯誤(謬誤) * 在使用數學歸納法得證明中,我們必須完成一個正確的基本步驟和歸納步驟 * 有時很難找到數學歸納法中的證明錯誤 ## 強歸納法和良序 Strong Induction & Well-Ordering * 強歸納法有時被稱為數學歸納法的第二個原理或完全歸納法 * 定理 : 假設每個正整數 $n$ 都有一個命題 $P(n)$ * 基本步驟 : 證明 $P(1)$ 為真 * 歸納步驟 : 證明 $[P(1) \vee P(2) \vee \dots \vee P(k)] \rightarrow P(k+1)$ 為真 (對所有正整數 $k$ 而言) --- * 例題 : 有一個遊戲,它的規則是兩名玩家輪流從兩堆火柴中各取出任意數量的火柴,取出最後一支火柴的玩家贏得遊戲。請證明如果兩堆火柴的初始數量相同,則第二位玩家總是保證獲勝 $Ans:$ 令 $P(n)$ 為命題第二為玩家總是能在初始每堆內有 $n$ 支火柴的情況下獲得勝利 * 基本步驟 : $P(1)$ 為真,因為兩堆火柴都各為一支,第一位成員只能拿取其中一根,剩下一根只能由第二位成員拿取,使第二位玩家獲勝 * 歸納步驟 : 設 $P(j)$ 為真( $1 ≦ j ≦ k$ ),因此在遊戲開始時,兩堆火柴各有 $1 ≦ j ≦ k$ 支火柴,第二位玩家總是可以贏得比賽。我們需要證明 $P(k+1)$ 為真,並假設第一位玩家從某堆火柴取出了 $r$ 支( $1 ≦ r ≦ k$ ),而這堆火柴內只剩下 $k+1-r$ 支。第二位玩家再從另一堆火柴內取出相同數量的火柴,因此兩堆的火柴數都剩下 $k+1-r$ 支。因為 $1 ≦ k+1-r ≦ k$,所以我們證明了第二位玩家總是可以贏得比賽。 * 另一種形式的強歸納法 * 基本步驟 : 驗證命題 $P(b), P(b+1), \dots, P(b+j)$ 為真 * 歸納步驟 : 證明 $[P(b), P(b+1), \dots, P(k)] \rightarrow P(k+1)$ 為真 ( $k ≧ b+j$ ) --- * 例題 : 證明所有金額為12美分或以上的郵資都可以只使用4美分和5美分的郵票來構成 $Ans:$ * 基本步驟 : $12 = 3 \times 4 + 0 \times 5$ $13 = 2 \times 4 + 1 \times 5$ $14 = 1 \times 4 + 2 \times 5$ $15 = 0 \times 4 + 3 \times 5$ $\therefore P(j) \text{ 成立 } (12 ≦ j ≦ 15)$ * 歸納步驟 : 設 $P(j)$ 為真( $12 ≦ j ≦ k, k>15)$,我們需要證明 $P(k+1)$ 為真 : 使用 $P(k-3)$ 的郵資加上4美分郵票就可以組成 $k+1$ 的郵資 * 良序原理 : 數學歸納法與強歸納法的有效性皆來自整數集合的一個基本公理 * 例題 : 在循環賽中,每位選手與其他所有選手各交手一次,每場比賽都產生勝者和負者。我們稱選手 $p_1, p_2, ..., p_m$ 構成一個循環,如果 $p_1$ 勝 $p_2$,$p_2$ 勝 $p_3$,…,$p_{m-1}$ 勝 $p_m$,且 $p_m$ 勝 $p_1$。利用良序原理證明,如果循環賽中存在長度為 $m (m ≥ 3)$ 的循環,則必然存在由這三位選手組成的循環 $Ans:$ 我們假設不存在三人循環。由於循環賽中至少存在一個循環,因此存在長度為 $n$ 的循環的所有正整數 $n$ 的集合非空。根據良序性,此正整數集合存在最小元素 $k$,根據假設,$k$ 必須大於 3。因此,存在一個由 $p_1, p_2, p_3, \dots, p_k$ 組成的循環,且不存在較短的循環。由於不存在三人循環,我們知道 $k > 3$。考慮該循環的前三個元素 $p_1$、$p_2$ 和 $p_3$。 $p_1$ 和 $p_3$ 的比賽有兩種可能的結果。如果 $p_3$ 戰勝 $p_1$,則 $p_1$、$p_2$、$p_3$ 構成一個長度為 3 的循環,這與我們假設不存在三人循環相矛盾。因此,必然是 $p_1$ 戰勝 $p_3$。這表示我們可以從循環 $p_1, p_2, p_3, \dots, p_k$ 省略 $p_2$,得到長度為 $k$ 的循環 $p_1, p_2, p_3, \dots, p_k$,這與最小循環長度為 $k$ 的假設相矛盾。由此我們得出結論:必然存在長度為 3 的循環。 ## 遞迴定義與結構歸納 * 遞迴定義函數 : 分成兩部分定義 * 基礎步驟 : $f(0)$ * 遞迴步驟 : 從 $f(n)$ 找到 $f(n+1)$ * 費波那契數列 $$ \begin{cases} f(0) = 0 \\ f(1) = 1 \\ f(n) = f(n-1) + f(n-2) \end{cases} $$ * 例題 : 證明 $n ≧ 3$ 時, $f(n) > \alpha^{n-2}$,在 $\alpha = (1 + \sqrt 5) / 2$ 處 $Ans:$ 使用強歸納法,令 $P(n)$ 符合 $f(n) > \alpha^{n-2}$ 敘述 * 基本步驟 : * $\alpha < 2 = f(3) \Rightarrow P(3)$ 成立 * $\alpha ^2 = (3 + \sqrt 5) / 2 < 3 = f(4) \Rightarrow P(4)$ 成立 * 歸納步驟 : * 設 $P(j)$ 成立,也就是 $f(j)> \alpha ^{j-2}$,對所有符合 $3 ≦ j ≦ k \ (k ≧ 4)$ 的整數 $j$ 而言。我們需要證明 $P(k+1)$ 成立,也就是 $f(k+1) > \alpha ^{k-1}$ 成立 * 已知 $\alpha$ 為 $x^2 - x - 1 = 0$ 的解,所以 $\alpha^2 = \alpha + 1$。將其代入 : $\alpha ^{k-1} = \alpha ^ 2 \times \alpha ^{k-3} = (\alpha + 1) \times \alpha ^{k-3} = \alpha ^{k-2} \times \alpha ^{k-3}$ * 根據強歸納假設,當 $k ≧ 4$ 時 : $f(k-1) > \alpha ^{k-3}, \ f(k) > \alpha ^{k-2}$ * 因此我們得到 $f(k+1) = f(k) + f(k-1) > \alpha ^{k-2} + \alpha ^{k-3} = \alpha ^{k-1}$ * $f(k+1) > \alpha ^{k-1}$ ,因此 $P(k)$ 成立,得證 * 遞迴定義集合與結構 * 基礎步驟 : 指定初始元素集合 * 遞迴步驟 : 根據集合中已知元素,形成新的元素 * 所有字串的集合 $\Sigma^*$ * 基本步驟 : $\lambda \in \Sigma^*$ ($\lambda$是空字串) * 遞迴步驟 : 若 $w \in \Sigma^*$ 且 $x \in \Sigma$,則 $wx \in \Sigma ^*$ * 有根樹(rooted tree)定義 * 基本步驟 : 一個單一節點 $r$ 為一有根樹 * 遞迴步驟 : 如果 $T_1,T_2,\cdots,T_n$ 是互不相交、根分別為 $r_1,r_2,\cdots,r_n$ 的有根樹,那麼再加一個新頂點 $r$ 並從 $r$ 向每個 $r_i$ 連邊所得到的圖也是一棵有根樹 * 完滿二元樹(full binary tree)定義 * 基本步驟 : 有一完滿二元樹只由一個節點 $r$ 組成 * 遞迴步驟 : 若一棵二元樹的根剛好有左、右兩棵子樹,且這兩棵子樹本身都是完滿二元樹,那這棵二元樹就是完滿二元樹 * 結構化歸納法 * 基本步驟 : 證明那些在集合基礎步驟中所定義的成員是符合題意的要求的 * 遞迴步驟 : 假設那些用來建造新成員的成員符合題意的要求,之後要證明用集合遞迴規則所建造的新成員亦符合題意的要求 ## 遞迴演算法 * 遞迴 recursive : 藉由把問題簡化到更小輸入的相同問題,來解決原問題的演算法(不斷呼叫自己)。例 : 費波那契數列、階層、最大公因數、二元搜尋法等 * 虛擬碼 : 以費波那契數列為例 ```persudo procedure fibonacci(n: nonnegative) if n = 0 then return 0 else if n = 1 then return 1 else return fibonacci(n−1) + fibonacci(n−2) ``` * 迭代 iterative : 從基礎步驟開始,使用遞迴步驟找到函數在連續更大整數的值(由小找到大) * 虛擬碼 : 以費波那契數列為例 ```persudo procedure iterative fibonacci(n: nonnegative integer) if n = 0 then return 0 else x : = 0; y := 1; for i := 1 to n−1 z := x + y; x := y; y := z return y {y is the nth Fibonacci number} ```