1 / 54

第四章 歸納與遞迴

第四章 歸納與遞迴. 4.1 數學歸納法. 數學歸納法原理 為了證明對所有正整數 n 而言, P ( n ) 皆為真,其中 P ( n ) 為一個命題函數。我們必須完成兩個步驟: 基礎步驟 :往證 P (1) 為真。 歸納步驟 :往證對所有正整數 k ,條件命題 P ( k )  P ( k + 1) 為真。. 數學等式. 例 :證明當 n 為正整數時, 1 + 2 + …+ n = n ( n + 1)/2 。

Download Presentation

第四章 歸納與遞迴

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第四章 歸納與遞迴

  2. 4.1 數學歸納法 • 數學歸納法原理 為了證明對所有正整數n而言,P(n)皆為真,其中P(n)為一個命題函數。我們必須完成兩個步驟: • 基礎步驟:往證P(1)為真。 • 歸納步驟:往證對所有正整數k,條件命題 P(k) P(k + 1)為真。

  3. 數學等式 • 例:證明當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, …。

  4. 基礎步驟: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為真。

  5. 將(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)為真。如此便完成了歸納步驟的證明。

  6. 完成了基礎步驟與歸納步驟後,根據數學歸納法可知,對所有的正整數n,P(n)為真。也就證明了,當n為正整數時, 1 + 2 + … + n= n(n + 1)/2 。

  7. 不等式 • 例:證明對所有的正整數n,不等式n < 2n皆成立。 • 解: 令P(n)為下述命題:n < 2n。 • 基礎步驟:P(1)為真,因為1 < 21 = 2。

  8. 歸納步驟:令歸納假說為“對任意整數k,P(k)為真。即,對任意整數k,不等式k < 2k成立。 為證明條件命題P(k) P(k + 1)為真。必須證明k+1 < 2k+1成立。在歸納假說之不等式兩端分別加上1,k + 1 < 2k +1  2k + 2k = 22k = 2k+1。 得到不等式k + 1 < 2k+1。其中,使用了不等式1  2k。 P(k + 1)為真,完成了數學歸納法的兩個步驟。

  9. 例:證明當n為正整數時,3能整數n3n。 • 解:令P(n)為下述命題:3能整數n3n。 • 基礎步驟:P(1)為真,因為13 1 = 0,而3能整除0。

  10. 歸納步驟:令歸納假說為“當k為正整數,k3k能被3整除。歸納步驟:令歸納假說為“當k為正整數,k3k能被3整除。 (k + 1)3 (k + 1) = (k3 + 3k2 + 3k + 1)  (k + 1) = (k3k) + 3(k2 + k) 因為兩項都能被3整除,第一項根據歸納假說能被3整除,而第二項很清楚是個3的倍數。 所以,3能整除(k + 1)3 (k + 1)。

  11. 有限集合之子集合個數 • 例:證明若集合S中有n個元素,其中n為非負整數。則S有2n個子集合。 • 解:令P(n)為下述命題:一個包含n個元素的集合共有2n個子集合。 • 基礎步驟:P(0)為真,因為空集合只有20 = 1個子集合。(即其本身)

  12. 歸納步驟:令歸納假說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個元素的集合。任意挑選一個元素aT,可將集合T表為T = S{a},其中S為包含k個元素的集合。令XS,則XT,而X{a}也是T的子集合。根據歸納假說,S有2k個子集合。所以,T有2  2k = 2k+1個子集合。完成了歸納步驟的證明。

  13. 有創意的使用數學歸納法(奇數個派的競賽) • 例:假設有奇數個人分別站在一個廣場上,兩兩的距離皆不相同。若每個人都將手中的派丟向距離自己最近的人,且砸在這個人身上。利用數學歸納法證明,必定有一個人能倖免,也就是至少有一個人不會被派砸到。 • 解:令命題P(n)表示當有2n+1個人兩兩的距離皆不相同。若每個人都將手中的派砸向距離自己最近的人身上時,會有個人倖免。

  14. 基礎步驟:當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)為真。

  15. 假設有2(k+1)+1 = 2k+3個人在廣場上。令A與B是廣場中距離最近的一對。則他們倆人將互相將派丟向對方。此時,剩下的2k+1個人,都不會被A與B的派丟到。根據歸納假設,一定有人沒被派丟到。如此,完成了歸納步驟的證明。 由於完成了數學歸納法的兩個步驟,也就得證了對所有的正整數n,P(n)皆為真,即,當有2n+1個人兩兩的距離皆不相同。若每個人都將手中的派砸向距離自己最近的人身上時,會有個人倖免。

  16. 4.2 強歸納法與良序 • 當P(n)為一個命題函數,為證明對所有的正整數n,P(n)為真,必須完成下面兩個步驟: • 基礎步驟:證明命題P(1)為真。 • 歸納步驟:證明下面的條件命題“對所有正整數k,[P(1)P(2) … P(k)] P(k+1)”為真。

  17. 例:若n為大於1的整數,證明n能表為一些質數的乘積。例:若n為大於1的整數,證明n能表為一些質數的乘積。 • 解:令P(n)為命題:n能表為一些質數的乘積。 • 歸納步驟:P(2)為真,因為2能表成一個質數2的乘積。

  18. 基礎步驟:令歸納假說為:對所有的正整數j,2 jk,P(j)皆為真。 有兩種情況必須考慮。當k+1為質數與當k+1為合成數。 若k+1為質數,則P(k+1)為真。因為k+1能表成一個質數的乘積,即k+1本身。 若k+1為合成數,則存在兩個正整數a與b,使得k+1 = ab。 我們注意到2 a, bk +1,根據歸納假說a與b皆能表為一些質數的乘積。所以,k+1 = ab能表為一些質數(包含所有乘積為a與b之質數)的乘積。綜合這兩種狀況,可得對所有的正整數j,2 jk,P(k)皆為真。

  19. 例:假設有兩個人輪流移去兩堆火柴中任一堆內任何數目的火柴。拿走最後一根火柴的人獲勝。證明若兩堆火柴的數目相同時,第二個人必定會獲勝。例:假設有兩個人輪流移去兩堆火柴中任一堆內任何數目的火柴。拿走最後一根火柴的人獲勝。證明若兩堆火柴的數目相同時,第二個人必定會獲勝。 • 解:假設n表示兩堆火柴的數目。令P(n)為命題:當兩堆火柴的數目皆為n時,第二個人會獲勝。 • 基礎步驟:當n = 1很明顯的,第二個移動火柴的人會獲勝,所以P(1)為真。

  20. 歸納步驟:歸納假說為:假設對所有的正整數j,1 jk,P(j)皆為真。現在令兩堆火柴各有k+1根,首先第一個人必須由某堆中移去若干根火柴。此時,第二個人只要從另一堆中移去相同數目的火柴。則情況將變成有兩堆相同數目(火柴數小於k)的火柴。根據歸納假說,第二個人將獲勝。即,P(k+1)為真。 • 完成兩個步驟,根據強歸納法得證所需結果為真。

  21. 利用良序原理的證明 • 兩種歸納法(數學歸納法與強歸納法)的有效性階來自整數集合的一個基本公理──良序原理(well-ordering property) • 良序原理: 每個非空的非負整數集合都有個最小元素。

  22. 例:利用良序原理證明除法公式:若a為整數,而d為正整數,則存在的整數q與r,其中0 r < d,使得a = dq + r。 • 解:令S為所有形如adq之非負整數的集合,其中q為整數。這個集合是非空集合,因為可以選擇夠大的負整數q,使得a dq為非負整數。根據良序原理,S有個最小的元素r = adq0。 我們也能因而推論r < d。否則,將有個更小的非負元素rd = ad(q0 + 1)在集合S中。如此一來便證明了q與r的存在性。

  23. 4.3 遞迴定義與結構化歸納法 • 有時難以用明確的方式來定義一個對象。不過,用這個對象來定義它自身卻可能是容易的。這種過程稱為遞迴(recursion)。 • 我們可以用遞迴來定義序列、函數和集合。

  24. 以遞迴方式定義函數 • 用下列兩個步驟來定義以非負整數集合作為定義域的函數: 基礎步驟:指定這個函數在0處的值。 遞迴步驟:給出從整數較小處的函數值來求出目前之函數值的規則。 • 這樣的定義稱為遞迴定義(recursive definition)或歸納定義(inductive definition)。

  25. 例:假設f是以f(0) = 3;f(n + 1) = 2f(n) + 3來遞迴定義。求出f(1)、f(2)、f(3)和f(4)。 • 解:由遞迴定義得到 f(1) = 2f(0) + 3 = 23 + 3 = 9 f(2) = 2f(1) + 3 = 29 + 3 = 21 f(3) = 2f(2) + 3 = 221 + 3 = 45 f(4) = 2f(3) + 3 = 245 + 3 = 93

  26. 例: 找出階乘函數F(n) = n!的歸納定義。 • 解:首先規定階乘函數的初始值,F(0) = 1。 然後從F(n)求出F(n+1)的規則來定義函數。 因為n!乘上n+1便能算出(n+1)!。所以, F(n+1) = (n+1) F(n)。

  27. 定義 • 費氏數(Fibonacci number) f0、f1、f2、…,是以等式f0 = 0、f1 = 1,以及 當n = 2, 3, …,fn = fn1 + fn2來定義。 • 我們可以用費氏數的遞迴定義來證明這些數的某些性質,見下例。

  28. 例: 證明當n 3時,fn > n-2,其中= (1+(5)1/2)/2。 • 解:用強歸納法來證明這個不等式。 設P(n)是命題:fn > n-2。往證當n3時,P(n)為真。 • 基礎步驟:首先,< 2 = f3, 2 = (3 + (5)1/2)/2 < 3 = f4,所以P(3)和P(4)都為真。

  29. 歸納步驟: 假設P(j)為真,即所有滿足 3 jk的整數j,有fj >  j-2,其中k 4。往證P(k+1)為真,即fk+1 >  k1。 因為是x2x  1 = 0的解,所以得出2 =  + 1。 k 1 = 2.k 3 = (+1)k 3 = .k 3+1.k 3 = k 2+k 3 根據歸納假設,若k 4,fk1 > k 3與fk > k2。 因此,fk+1 = fk + fk1 > k2 + k3 = k1,得P(k+1)為真。

  30. 以遞迴方式定義的集合與結構 • 集合的遞迴定義也有兩個部分,即基礎步驟與遞迴步驟。 • 在基礎步驟裡,必須指定初始的集合元素。 • 在遞迴步驟裡,則必須提供已知元素形成新元素的規則。

  31. 遞迴定義也可能包含排除規則(exclusion rule):以遞迴方式所定義的集合,除了基礎步驟所指定的元素以及應用遞迴步驟所產生的元素以外,不含任何其他的元素。

  32. 例: S是正整數集合的子集合,定義如下, • 基礎步驟:3 S。 • 遞迴步驟:若xS且yS,則x + yS。 • 根據基礎步驟,在S裡找到的新元素是3,而第一次應用遞迴步驟則產生3 + 3 = 6,第二次應用遞迴步驟產生3 + 6 = 6 + 3 = 9與6 + 6 = 12,依此類推。稍後,我們將證明S即為所有3的倍數所成的集合。

  33. 例: 試證上例所定義的集合S是所有3的倍數所形成的整數集合。 • 解:令A是所有可被3整除的正整數集合。 為了證明A = S,必須證明AS,而且SA。 往證A是S的子集合,必須證明每一個可被3整除的正整數都屬於S。 我們將以數學歸納法證明這一點。

  34. 令P(n)為下列命題:3n屬於S。 基礎步驟:由於S遞迴定義中的第一部分:3.1 = 3S。 歸納步驟:假設P(k)為真,亦即3k是S的元素。 既然3kS,而且3S。根據S遞迴定義的第二部分,得到3k+3 = 3(k+1)S。

  35. 現在使用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。

  36. 定義 • 字母集Σ上的字串的集合Σ*遞迴地定義成: 基礎步驟:λΣ*(其中λ是不包含任何符號的空字串)。 遞迴步驟:若w Σ* 且x Σ*,則wx Σ*。

  37. 透過串接(concatenation)的操作可以將兩個字串加以結合。令Σ是符號集合,Σ*是由Σ裡的符號所形成字串集合。將兩個字串串接,以遞迴的方式定義如下:透過串接(concatenation)的操作可以將兩個字串加以結合。令Σ是符號集合,Σ*是由Σ裡的符號所形成字串集合。將兩個字串串接,以遞迴的方式定義如下: 基礎步驟:如果w Σ*,則w.λ = w,λ是空字串。 遞迴步驟:如果w1 Σ*,w2 Σ*,而且x Σ,則 w1.(w2x) = (w1.w2)x。

  38. 字串的長度 • 例: 給出字串w的長度l(w)的遞迴定義。 • 解:字串的長度可以定義成 l(λ) = 0 l(wx) = l(w) + 1,若w Σ*而且x Σ。

  39. 結構化歸納 (structure induction) • 結構化歸納的證明分成兩部分,分別是: • 基礎步驟:證明對遞迴定義之基礎步驟中指定的元素,而且結果是成立的。 • 遞迴步驟:證明對於在定義的遞迴步驟中用以產生新元素的每一個元素而言,該結果都成立,則對於這些新的元素而言,該結果也成立。

  40. 例:使用結構化歸納證明l(xy) = l(x)+l(y),x,yΣ*。(字母集上的字串所成的集合。) • 解:依據Σ*的遞迴定義,及範例中對字串長度的定義。 令P(y)是下列陳述:“如果x屬於Σ*,則l(xy) = l(x)+l(y)”。

  41. 基礎步驟:為了完成基礎步驟,必須證明P(λ)為真。亦即證明,對於所有x Σ*,l(xλ) = l(x)+l(λ)。因為對於所有的字串x而言,l(xλ) = l(x)+0 = l(x)+l(λ),所以P(λ)為真。

  42. 遞迴步驟:假設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)。

  43. 4.4 遞迴演算法 • 定義: 藉由把問題簡化到更小輸入的相同問題,來解決原問題的演算法稱為遞迴演算法。 • 例:給出計算n!的遞迴演算法,n為非負整數。

  44. 解:根據n!的遞迴定義:n! = n(n1)!且0! = 1,來建構計算n!的遞迴演算法,其中n為非負整數。 為求出某個特定整數的n!,使用遞迴步驟n次,每次都代入一個較小整數的階乘函數。直到最後代入最小的階乘函數0! = 1為止。得出遞迴演算法陳述如下頁。

  45. 演算法:計算n!的遞迴演算法 procedurefactorial (n: nonnegative integer) if n = 0 thenfactorial(n) := 1 elsefactorial(n) := n factorial(n  1)

  46. 要了解為何演算法可行,我們依循演算法的步驟,求出4!的值。要了解為何演算法可行,我們依循演算法的步驟,求出4!的值。 • 首先,利用遞迴步驟得到4! = 43!。接下來,重複遞迴步驟:3! = 32!,2! = 21!,1! = 10!。最後代入0! = 1,回溯這些步驟,得到1! = 11 = 1,2! = 21! = 21 = 2,3! = 32! = 32 = 6,而4! = 43! = 46 = 24。

  47. 例:給出計算an的遞迴演算法,其中a是非零實數,而n為非負整數。例:給出計算an的遞迴演算法,其中a是非零實數,而n為非負整數。 • 解:根據an的遞迴定義:當n > 0時,an = aan1且a0 = 1,來建構計算an的遞迴演算法。 為求出某個特定整數n的an,持續使用遞迴步驟降低指數,直到指數變為1為止。我們將遞迴演算法陳述如下。

  48. 演算法:計算an的遞迴演算法 procedure power(a: nonzero real number, n: nonnegative integer) if n = 0 thenpower(a, n) := 1 elsepower(a, n) := a power(a, n1)

  49. 例:建構一個二元搜索演算法的遞迴版本。 • 解:假定要在遞增的整數序列a1, a2, …, an中搜索x。在二元搜索中,先比較x與中間項a(n+1)/2。若x等於這一項,則演算法終止。若x小於此項,則將搜索數列簡化成原數列的前一半;反之,若x大於此項,則將搜索數列簡化成後一半。然後,重複原來的搜索過程。二元搜索演算法的遞迴形式陳述如下頁。

  50. 演算法:遞迴二元搜索演算法 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

More Related