前言
學算法,不得不提的就是數學歸納法。許多算法都會用到歸納假設的思想,其追溯回去便是數學歸納法。
數學歸納法
最簡單和常見的數學歸納法是證明當n等於任意一個自然數時某命題成立。證明分下面兩步:
- 證明當n = 1時命題成立。
- 證明如果在n = k時命題成立,那麼可以推導出在n = k+1時命題也成立。(k代表任意自然數)
這種方法的原理在於:首先證明在某個起點值時命題成立,然後證明從一個值到下一個值的過程有效。當這兩點都已經證明,那麼任意值都可以通過反覆使用這個方法推導出來。把這個方法想成多米諾效應也許更容易理解一些。例如:你有一列很長的直立着的多米諾骨牌,如果你可以:
- 證明第一張骨牌會倒。
- 證明只要任意一張骨牌倒了,那麼其下一張骨牌也會因爲前面的骨牌倒而跟着倒。
那麼便可以下結論:所有的骨牌都會倒下。
應用舉例
1. 前n項和
證明:S(n) = 1 + 2 + 3 …. + n 前n項和爲n(n + 1) / 2
n = 1, S(1) = 1
假設n時命題成立
N+ 1時,
S(n + 1)
= S(n) + n + 1
= n(n + 1)/2 + n + 1
= (n + 1)(n + 2)/ 2
成立
2. 區域計數
問n條居一般位置的直線能將平面分成多少個區域
定義:一般位置, 任意兩線不平行,任意三線不共點。
現在草稿紙上看看簡單的情況,看看有沒有規律。
直線 -- 區域
1 -- 2
2 -- 4
3 -- 7
4 -- 11
找規律 第n條直線能比n-1條直線的區域多n個
證明: 在平面內n- 1條居一般位置的直線添加一條直線會增加n個區域
n <= 3 時 顯然成立
假設n-1條直線時成立
加入第n條直線
假設刪去第n - 1條直線,
根據假設,這樣加入的第n條增加了n - 1區域
而放回第n-1條直線,直線l(n)與l(n-1)必然在某一個區域R裏面相交
本來對於一個區域,l(n)穿過可以多出來一個區域
因爲l(n - 1)的存在,在R中l(n)多分出兩塊,其他還是一樣
所以l(n)多分出n塊區域
成立
3. 着色問題
證明:平面上任意直線構成的區域可以用兩種顏色進行着色,相鄰的區域顏色不同
n = 1, 顯然成立
假設n - 1條直線情況下成立
對於n條直線
加入第n條直線ln
ln 左邊的區域所有顏色不變
ln 右邊的區域所有顏色翻轉
兩種情況
- 兩區域在同一邊,原來不同,加入ln,要麼都不變,要麼都翻轉,還是不同
- 兩區域的原來是一塊的,顏色相同,被ln分開,一邊翻轉了,顏色不同
命題成立
4. 金字塔求和
證明:第i行的和爲i^3
要證第i行的和爲i^3
即證第i+1行和-第i行和 =( i+1)^3 - (i)^3
而看圖
i行有i個數
i行第一個與i+1行第一個相差2*i
兩兩相減,最後多一個
2 * i* i + x= ( i+1)^3 - (i)^3
即證明i行最後一個數爲[( i+1)^3 - (i)^3] - 2 * i * i = i^2 + 3 * i +1
即證明i+1行最後一個 - i行最後一個是(i+1)^2 + 3 * (I+1) +1 - [ i2 + 3 * i +1] = 2i + 2
由於前面已經看到i+1行與i行前面兩兩對其相差2I, 所以最後一個相差2i + 2
命題成立
5. 簡單不等式
證明1/2+1/4+1/8+…+1/2^n<1. n = 1, 1/2 < 1, 成立 假設1/2+1/4+1/8+…+1/2^n <1 成立 n+1時 按常規一般證明 1/2+1/4+1/8+…+1/2^n+1/2^(n+1) 前面<1, 加個1/2^(n+1)很難說還<1 沒法證 換個思路 1/2+1/4+1/8+…+1/2^n +1/2^(n+1) = 1/2+(1/4+1/8+…+1/2^n +1/2^(n+1) ) = 1/2+1/2 (1/2+1/4+1/8+…+1/2^n ) < 1/2+1/2=1 成立 原命題得證
6. 歐拉公式
圖論
面,圖中邊所圍的封閉區域,整個外面也算一個面
證明:任意一連通圖,節點數V, 邊數E, 面數F, 滿足 V + F = E + 2
對面數進行歸納
圖只有一個面時,也就是圖中沒有閉環,若有閉環,則必然有兩個面了就
考察樹
樹V = E + 1 公式成立
三角形,節點3, 面2, 邊3,成立
假設面數爲n時 V + F = E + 2 成立
面數n+1時
在連通圖裏面必然可以找到一個面與外邊的區域相鄰
刪去相鄰的邊
面數 - 1
邊數 - 1
剩下不變
根據假設,公式成立
則n+1時公式兩邊都+1,公式成立
命題成立
7. 有路可達
獨立集,節點集合,任一兩節點不相鄰
有向圖 <a, b> 表示a與b相鄰,b與a不相鄰
證明:G(V, E)有向圖,證明G中有一個獨立集S(G),使G中每一個節點都能由S(G)中的點通過長度不超過2的路到達
n <= 3 時, 必然成立
假設節點數<n的有向圖,命題成立
對於節點數爲n的有向圖
取一個點v
N(v)爲所有與v相鄰的點的集合 {w | <v, w> 在G中}
則對於圖H = G - v - N(v)
根據假設有S(H)能滿足命題要求
- 若S(G) = S(H) + {v} 是獨立集,v又與所有N(v)一步到,則這個圖中所有點都可由S(G) 兩步內到
- 若S(H) + {v} 不是獨立集,意味着S(H)中必然有一個p,存在邊<p, v>,這樣p可以經過兩步到所有N(v), 從而S(G) = S(H), 滿足要求
命題成立
8. 格雷碼
問題:產生n位元的所有格雷碼。
格雷碼(Gray Code)是一個數列集合,每個數使用二進位來表示,假設使用n位元來表示每個數字,任兩個數之間只有一個位元值不同。
例如以下爲3位元的格雷碼: 000 001 011 010 110 111 101 100 。
如果要產生n位元的格雷碼,那麼格雷碼的個數爲2^n.
假設原始的值從0開始,格雷碼產生的規律是:第一步,改變最右邊的位元值;第二步,改變右起第一個爲1的位元的左邊位元;第三步,第四步重複第一步和第二步,直到所有的格雷碼產生完畢(換句話說,已經走了(2^n) - 1 步)。
用一個例子來說明:
假設產生3位元的格雷碼,原始值位 000
第一步:改變最右邊的位元值: 001
第二步:改變右起第一個爲1的位元的左邊位元: 011
第三步:改變最右邊的位元值: 010
第四步:改變右起第一個爲1的位元的左邊位元: 110
第五步:改變最右邊的位元值: 111
第六步:改變右起第一個爲1的位元的左邊位元: 101
第七步:改變最右邊的位元值: 100
如果按照這個規則來生成格雷碼,是沒有問題的,但是這樣做太複雜了。如果仔細觀察格雷碼的結構,我們會有以下發現:
1、除了最高位(左邊第一位),格雷碼的位元完全上下對稱(看下面列表)。比如第一個格雷碼與最後一個格雷碼對稱(除了第一位),第二個格雷碼與倒數第二個對稱,以此類推。
2、最小的重複單元是 0 , 1。
000
001
011
010
110
111
101
100
所以,在實現的時候,我們完全可以利用遞歸,在每一層前面加上0或者1,然後就可以列出所有的格雷碼。
比如:
第一步:產生 0, 1 兩個字符串。
第二步:在第一步的基礎上,每一個字符串都加上0和1,但是每次只能加一個,所以得做兩次。這樣就變成了 00,01,11,10 (注意對稱)。
第三步:在第二步的基礎上,再給每個字符串都加上0和1,同樣,每次只能加一個,這樣就變成了 000,001,011,010,110,111,101,100。
好了,這樣就把3位元格雷碼生成好了。
如果要生成4位元格雷碼,我們只需要在3位元格雷碼上再加一層0,1就可以了: 0000,0001,0011,0010,0110,0111,0101,0100,1100,1101,1110,1010,0111,1001,1000.
也就是說,n位元格雷碼是基於n-1位元格雷碼產生的。
9. 無重邊的路
節點的度數之和 = 邊的兩倍
證明:G(V,E)無向連通圖, O爲度數爲奇的節點的集合,一定爲偶數。證明O可以分出兩兩組成的節點對,對每一對節點都能找到連接他們的與其他路勁無重邊的路徑。
邊數m = 1, 顯然成立
假設邊數<m的連通的無向圖滿足命題
對於邊數m的圖
找到O中兩個點,必然有一條路
刪去這條路,只刪邊,不刪點
原來奇點刪路(兩條邊)後必然度還是奇數
剩下的點還在O中,必然邊數<m,可以歸納假設
但無法保證剩下的還聯通
增強歸納假設
假設邊數<m的無向圖(不需要條件連通)滿足命題
這樣刪掉那條路之後
可以分成多個連通的子圖
對於每個子圖,邊數<m,滿足假設
這樣在加上原來那條路
邊數m的圖成立
命題成立
常見錯誤
1. 由於常常要證明的東西是普遍認可的,是熟悉的,所以在證明的時候會偶爾忽略一些條件。如上面的無重邊的路問題,很容易忽略刪去這條路後原圖是否還連通的判斷,引發錯誤。
2. 基礎假設需要注意題目的條件,有些會有特殊情況,比如有些n = 1, n = 2 都是對的,n -1 也可以推n的情況,我們會按照數學歸納法判斷其正確。但就是特殊情況使得 n = 2 推不了n = 3, 那麼整個歸納就錯了。
總結
數學歸納法的思想主要就是兩種:
1. 知道基礎解,然後可以由n的情況推n + 1。
2.知道基礎解,知道n+1的情況,並能證明n+1的情況可以由n的情況推出。
計算機科學與數學密切相關,其中的遞歸便是用的數學歸納法的思想。