540 likes | 615 Views
第四章 歸納與遞迴. 4.1 數學歸納法. 數學歸納法原理 為了證明對所有正整數 n 而言, P ( n ) 皆為真,其中 P ( n ) 為一個命題函數。我們必須完成兩個步驟: 基礎步驟 :往證 P (1) 為真。 歸納步驟 :往證對所有正整數 k ,條件命題 P ( k ) P ( k + 1) 為真。. 數學等式. 例 :證明當 n 為正整數時, 1 + 2 + …+ n = n ( n + 1)/2 。
E N D
4.1 數學歸納法 • 數學歸納法原理 為了證明對所有正整數n而言,P(n)皆為真,其中P(n)為一個命題函數。我們必須完成兩個步驟: • 基礎步驟:往證P(1)為真。 • 歸納步驟:往證對所有正整數k,條件命題 P(k) P(k + 1)為真。
數學等式 • 例:證明當n為正整數時,1 + 2 + …+ n = n(n + 1)/2。 • 解:令P(n)為述命題:首n個正整數的和為n(n + 1)/2。我們必須完成兩件事來證明P(n)對所有的n = 1, 2, 3, …,皆為真。首先,說明P(1)為真;然後再證明條件命題P(k) P(k + 1)為真,其中k = 1, 2, 3, …。
基礎步驟:P(1)為真,因為1 = 1(1 + 1)/2。 • 歸納步驟:令歸納假說為“對任意整數k,P(k)為真。即, 1 + 2 + … + k = k(k + 1)/2。 • 在歸納假說下,我們將證明P(k+1)為真,即, 1 + 2 + … + k + (k + 1) = (k + 1) ((k + 1) + 1)/2 = (k + 1)(k + 2)/2為真。
將(k + 1)加到歸納假說之等式兩端, 1 + 2 + … + k + (k +1) =k(k + 1)/2 + (k + 1) = (k(k + 1) + 2(k + 1))/2 = (k + 1)(k + 2)/2。 • 等式最後告訴我們P(k+1)為真。如此便完成了歸納步驟的證明。
完成了基礎步驟與歸納步驟後,根據數學歸納法可知,對所有的正整數n,P(n)為真。也就證明了,當n為正整數時, 1 + 2 + … + n= n(n + 1)/2 。
不等式 • 例:證明對所有的正整數n,不等式n < 2n皆成立。 • 解: 令P(n)為下述命題:n < 2n。 • 基礎步驟:P(1)為真,因為1 < 21 = 2。
歸納步驟:令歸納假說為“對任意整數k,P(k)為真。即,對任意整數k,不等式k < 2k成立。 為證明條件命題P(k) P(k + 1)為真。必須證明k+1 < 2k+1成立。在歸納假說之不等式兩端分別加上1,k + 1 < 2k +1 2k + 2k = 22k = 2k+1。 得到不等式k + 1 < 2k+1。其中,使用了不等式1 2k。 P(k + 1)為真,完成了數學歸納法的兩個步驟。
例:證明當n為正整數時,3能整數n3n。 • 解:令P(n)為下述命題:3能整數n3n。 • 基礎步驟:P(1)為真,因為13 1 = 0,而3能整除0。
歸納步驟:令歸納假說為“當k為正整數,k3k能被3整除。歸納步驟:令歸納假說為“當k為正整數,k3k能被3整除。 (k + 1)3 (k + 1) = (k3 + 3k2 + 3k + 1) (k + 1) = (k3k) + 3(k2 + k) 因為兩項都能被3整除,第一項根據歸納假說能被3整除,而第二項很清楚是個3的倍數。 所以,3能整除(k + 1)3 (k + 1)。
有限集合之子集合個數 • 例:證明若集合S中有n個元素,其中n為非負整數。則S有2n個子集合。 • 解:令P(n)為下述命題:一個包含n個元素的集合共有2n個子集合。 • 基礎步驟:P(0)為真,因為空集合只有20 = 1個子集合。(即其本身)
歸納步驟:令歸納假說P(k)為“包含k個元素的集合共有2k個子集合。”必須證明P(k+1)也為真。也就是包含k+1個元素的集合共有2k+1個子集合。歸納步驟:令歸納假說P(k)為“包含k個元素的集合共有2k個子集合。”必須證明P(k+1)也為真。也就是包含k+1個元素的集合共有2k+1個子集合。 假設T為一個包含k + 1個元素的集合。任意挑選一個元素aT,可將集合T表為T = S{a},其中S為包含k個元素的集合。令XS,則XT,而X{a}也是T的子集合。根據歸納假說,S有2k個子集合。所以,T有2 2k = 2k+1個子集合。完成了歸納步驟的證明。
有創意的使用數學歸納法(奇數個派的競賽) • 例:假設有奇數個人分別站在一個廣場上,兩兩的距離皆不相同。若每個人都將手中的派丟向距離自己最近的人,且砸在這個人身上。利用數學歸納法證明,必定有一個人能倖免,也就是至少有一個人不會被派砸到。 • 解:令命題P(n)表示當有2n+1個人兩兩的距離皆不相同。若每個人都將手中的派砸向距離自己最近的人身上時,會有個人倖免。
基礎步驟:當n = 1時,有3個人丟派,設此三人為A, B與C。因為兩兩的距離並不相等,我們能假設A與C的距離和B與C皆大於A與B。如此一來,A與B都會將手中的派砸向對方,而C則丟向A或B。所以,C將不會被派砸到。故,P(1)為真。 • 歸納步驟:令歸納假說為P(k)為真,也就是說,有2k+1個人丟派時,有人不會被派丟到。我們將往證P(k+1)為真。
假設有2(k+1)+1 = 2k+3個人在廣場上。令A與B是廣場中距離最近的一對。則他們倆人將互相將派丟向對方。此時,剩下的2k+1個人,都不會被A與B的派丟到。根據歸納假設,一定有人沒被派丟到。如此,完成了歸納步驟的證明。 由於完成了數學歸納法的兩個步驟,也就得證了對所有的正整數n,P(n)皆為真,即,當有2n+1個人兩兩的距離皆不相同。若每個人都將手中的派砸向距離自己最近的人身上時,會有個人倖免。
4.2 強歸納法與良序 • 當P(n)為一個命題函數,為證明對所有的正整數n,P(n)為真,必須完成下面兩個步驟: • 基礎步驟:證明命題P(1)為真。 • 歸納步驟:證明下面的條件命題“對所有正整數k,[P(1)P(2) … P(k)] P(k+1)”為真。
例:若n為大於1的整數,證明n能表為一些質數的乘積。例:若n為大於1的整數,證明n能表為一些質數的乘積。 • 解:令P(n)為命題:n能表為一些質數的乘積。 • 歸納步驟:P(2)為真,因為2能表成一個質數2的乘積。
基礎步驟:令歸納假說為:對所有的正整數j,2 jk,P(j)皆為真。 有兩種情況必須考慮。當k+1為質數與當k+1為合成數。 若k+1為質數,則P(k+1)為真。因為k+1能表成一個質數的乘積,即k+1本身。 若k+1為合成數,則存在兩個正整數a與b,使得k+1 = ab。 我們注意到2 a, bk +1,根據歸納假說a與b皆能表為一些質數的乘積。所以,k+1 = ab能表為一些質數(包含所有乘積為a與b之質數)的乘積。綜合這兩種狀況,可得對所有的正整數j,2 jk,P(k)皆為真。
例:假設有兩個人輪流移去兩堆火柴中任一堆內任何數目的火柴。拿走最後一根火柴的人獲勝。證明若兩堆火柴的數目相同時,第二個人必定會獲勝。例:假設有兩個人輪流移去兩堆火柴中任一堆內任何數目的火柴。拿走最後一根火柴的人獲勝。證明若兩堆火柴的數目相同時,第二個人必定會獲勝。 • 解:假設n表示兩堆火柴的數目。令P(n)為命題:當兩堆火柴的數目皆為n時,第二個人會獲勝。 • 基礎步驟:當n = 1很明顯的,第二個移動火柴的人會獲勝,所以P(1)為真。
歸納步驟:歸納假說為:假設對所有的正整數j,1 jk,P(j)皆為真。現在令兩堆火柴各有k+1根,首先第一個人必須由某堆中移去若干根火柴。此時,第二個人只要從另一堆中移去相同數目的火柴。則情況將變成有兩堆相同數目(火柴數小於k)的火柴。根據歸納假說,第二個人將獲勝。即,P(k+1)為真。 • 完成兩個步驟,根據強歸納法得證所需結果為真。
利用良序原理的證明 • 兩種歸納法(數學歸納法與強歸納法)的有效性階來自整數集合的一個基本公理──良序原理(well-ordering property) • 良序原理: 每個非空的非負整數集合都有個最小元素。
例:利用良序原理證明除法公式:若a為整數,而d為正整數,則存在的整數q與r,其中0 r < d,使得a = dq + r。 • 解:令S為所有形如adq之非負整數的集合,其中q為整數。這個集合是非空集合,因為可以選擇夠大的負整數q,使得a dq為非負整數。根據良序原理,S有個最小的元素r = adq0。 我們也能因而推論r < d。否則,將有個更小的非負元素rd = ad(q0 + 1)在集合S中。如此一來便證明了q與r的存在性。
4.3 遞迴定義與結構化歸納法 • 有時難以用明確的方式來定義一個對象。不過,用這個對象來定義它自身卻可能是容易的。這種過程稱為遞迴(recursion)。 • 我們可以用遞迴來定義序列、函數和集合。
以遞迴方式定義函數 • 用下列兩個步驟來定義以非負整數集合作為定義域的函數: 基礎步驟:指定這個函數在0處的值。 遞迴步驟:給出從整數較小處的函數值來求出目前之函數值的規則。 • 這樣的定義稱為遞迴定義(recursive definition)或歸納定義(inductive definition)。
例:假設f是以f(0) = 3;f(n + 1) = 2f(n) + 3來遞迴定義。求出f(1)、f(2)、f(3)和f(4)。 • 解:由遞迴定義得到 f(1) = 2f(0) + 3 = 23 + 3 = 9 f(2) = 2f(1) + 3 = 29 + 3 = 21 f(3) = 2f(2) + 3 = 221 + 3 = 45 f(4) = 2f(3) + 3 = 245 + 3 = 93
例: 找出階乘函數F(n) = n!的歸納定義。 • 解:首先規定階乘函數的初始值,F(0) = 1。 然後從F(n)求出F(n+1)的規則來定義函數。 因為n!乘上n+1便能算出(n+1)!。所以, F(n+1) = (n+1) F(n)。
定義 • 費氏數(Fibonacci number) f0、f1、f2、…,是以等式f0 = 0、f1 = 1,以及 當n = 2, 3, …,fn = fn1 + fn2來定義。 • 我們可以用費氏數的遞迴定義來證明這些數的某些性質,見下例。
例: 證明當n 3時,fn > n-2,其中= (1+(5)1/2)/2。 • 解:用強歸納法來證明這個不等式。 設P(n)是命題:fn > n-2。往證當n3時,P(n)為真。 • 基礎步驟:首先,< 2 = f3, 2 = (3 + (5)1/2)/2 < 3 = f4,所以P(3)和P(4)都為真。
歸納步驟: 假設P(j)為真,即所有滿足 3 jk的整數j,有fj > j-2,其中k 4。往證P(k+1)為真,即fk+1 > k1。 因為是x2x 1 = 0的解,所以得出2 = + 1。 k 1 = 2.k 3 = (+1)k 3 = .k 3+1.k 3 = k 2+k 3 根據歸納假設,若k 4,fk1 > k 3與fk > k2。 因此,fk+1 = fk + fk1 > k2 + k3 = k1,得P(k+1)為真。
以遞迴方式定義的集合與結構 • 集合的遞迴定義也有兩個部分,即基礎步驟與遞迴步驟。 • 在基礎步驟裡,必須指定初始的集合元素。 • 在遞迴步驟裡,則必須提供已知元素形成新元素的規則。
遞迴定義也可能包含排除規則(exclusion rule):以遞迴方式所定義的集合,除了基礎步驟所指定的元素以及應用遞迴步驟所產生的元素以外,不含任何其他的元素。
例: S是正整數集合的子集合,定義如下, • 基礎步驟:3 S。 • 遞迴步驟:若xS且yS,則x + yS。 • 根據基礎步驟,在S裡找到的新元素是3,而第一次應用遞迴步驟則產生3 + 3 = 6,第二次應用遞迴步驟產生3 + 6 = 6 + 3 = 9與6 + 6 = 12,依此類推。稍後,我們將證明S即為所有3的倍數所成的集合。
例: 試證上例所定義的集合S是所有3的倍數所形成的整數集合。 • 解:令A是所有可被3整除的正整數集合。 為了證明A = S,必須證明AS,而且SA。 往證A是S的子集合,必須證明每一個可被3整除的正整數都屬於S。 我們將以數學歸納法證明這一點。
令P(n)為下列命題:3n屬於S。 基礎步驟:由於S遞迴定義中的第一部分:3.1 = 3S。 歸納步驟:假設P(k)為真,亦即3k是S的元素。 既然3kS,而且3S。根據S遞迴定義的第二部分,得到3k+3 = 3(k+1)S。
現在使用S的遞迴定義來證明S是A的子集合。 首先,定義中的基礎步驟清楚指出3是S的元素。既然3 = 3.1,則在這個步驟中具體指出S的所有元素都可以被3整除。最後必須證明使用遞迴定義第二部分所生S的所有元素都屬於A。 這只需證明:當x與y是S的元素時,x+y屬於A。如果x與y同時屬於A,則3|x而且3|y。根據3.4節的定理1,可知3|x+y。
定義 • 字母集Σ上的字串的集合Σ*遞迴地定義成: 基礎步驟:λΣ*(其中λ是不包含任何符號的空字串)。 遞迴步驟:若w Σ* 且x Σ*,則wx Σ*。
透過串接(concatenation)的操作可以將兩個字串加以結合。令Σ是符號集合,Σ*是由Σ裡的符號所形成字串集合。將兩個字串串接,以遞迴的方式定義如下:透過串接(concatenation)的操作可以將兩個字串加以結合。令Σ是符號集合,Σ*是由Σ裡的符號所形成字串集合。將兩個字串串接,以遞迴的方式定義如下: 基礎步驟:如果w Σ*,則w.λ = w,λ是空字串。 遞迴步驟:如果w1 Σ*,w2 Σ*,而且x Σ,則 w1.(w2x) = (w1.w2)x。
字串的長度 • 例: 給出字串w的長度l(w)的遞迴定義。 • 解:字串的長度可以定義成 l(λ) = 0 l(wx) = l(w) + 1,若w Σ*而且x Σ。
結構化歸納 (structure induction) • 結構化歸納的證明分成兩部分,分別是: • 基礎步驟:證明對遞迴定義之基礎步驟中指定的元素,而且結果是成立的。 • 遞迴步驟:證明對於在定義的遞迴步驟中用以產生新元素的每一個元素而言,該結果都成立,則對於這些新的元素而言,該結果也成立。
例:使用結構化歸納證明l(xy) = l(x)+l(y),x,yΣ*。(字母集上的字串所成的集合。) • 解:依據Σ*的遞迴定義,及範例中對字串長度的定義。 令P(y)是下列陳述:“如果x屬於Σ*,則l(xy) = l(x)+l(y)”。
基礎步驟:為了完成基礎步驟,必須證明P(λ)為真。亦即證明,對於所有x Σ*,l(xλ) = l(x)+l(λ)。因為對於所有的字串x而言,l(xλ) = l(x)+0 = l(x)+l(λ),所以P(λ)為真。
遞迴步驟:假設P(λ)為真,必須證明當x Σ時,P(ya)為真。也就是,證明對於每個x Σ,l(xya) = l(x)+l(ya)。 要證明這一點,根據l(w)的遞迴定義,得到l(xya) = l(x)+1以及l(ya) = l(y)+1。根據歸納法假設,l(xy) = l(x)+l(y)。故,l(xya) = l(x)+l(y)=1 = l(x)+l(ya)。
4.4 遞迴演算法 • 定義: 藉由把問題簡化到更小輸入的相同問題,來解決原問題的演算法稱為遞迴演算法。 • 例:給出計算n!的遞迴演算法,n為非負整數。
解:根據n!的遞迴定義:n! = n(n1)!且0! = 1,來建構計算n!的遞迴演算法,其中n為非負整數。 為求出某個特定整數的n!,使用遞迴步驟n次,每次都代入一個較小整數的階乘函數。直到最後代入最小的階乘函數0! = 1為止。得出遞迴演算法陳述如下頁。
演算法:計算n!的遞迴演算法 procedurefactorial (n: nonnegative integer) if n = 0 thenfactorial(n) := 1 elsefactorial(n) := n factorial(n 1)
要了解為何演算法可行,我們依循演算法的步驟,求出4!的值。要了解為何演算法可行,我們依循演算法的步驟,求出4!的值。 • 首先,利用遞迴步驟得到4! = 43!。接下來,重複遞迴步驟:3! = 32!,2! = 21!,1! = 10!。最後代入0! = 1,回溯這些步驟,得到1! = 11 = 1,2! = 21! = 21 = 2,3! = 32! = 32 = 6,而4! = 43! = 46 = 24。
例:給出計算an的遞迴演算法,其中a是非零實數,而n為非負整數。例:給出計算an的遞迴演算法,其中a是非零實數,而n為非負整數。 • 解:根據an的遞迴定義:當n > 0時,an = aan1且a0 = 1,來建構計算an的遞迴演算法。 為求出某個特定整數n的an,持續使用遞迴步驟降低指數,直到指數變為1為止。我們將遞迴演算法陳述如下。
演算法:計算an的遞迴演算法 procedure power(a: nonzero real number, n: nonnegative integer) if n = 0 thenpower(a, n) := 1 elsepower(a, n) := a power(a, n1)
例:建構一個二元搜索演算法的遞迴版本。 • 解:假定要在遞增的整數序列a1, a2, …, an中搜索x。在二元搜索中,先比較x與中間項a(n+1)/2。若x等於這一項,則演算法終止。若x小於此項,則將搜索數列簡化成原數列的前一半;反之,若x大於此項,則將搜索數列簡化成後一半。然後,重複原來的搜索過程。二元搜索演算法的遞迴形式陳述如下頁。
演算法:遞迴二元搜索演算法 procedure binary search (i, j, x: i, j, x integers, 1 i n, 1 j n) m := (i+j)/2 ifx = amthen location := m else if (x < am and i < m) then binary search (x, i, m 1) else if (x > am and j > m) then binary search (x, m + 1, j) else location := 0