• 沒有找到結果。

遞迴關係在計數問題的應用

N/A
N/A
Protected

Academic year: 2021

Share "遞迴關係在計數問題的應用"

Copied!
6
0
0

加載中.... (立即查看全文)

全文

(1)

遞迴關係在計數問題的應用

許介彥

大葉大學 通訊與計算機工程學系

前言

在本刊第 2 3 8 期「遞迴函數的求解技巧」 一文中,筆者舉例說明了幾種特定形式的遞 迴 函 數 求 解 的 方 法 , 並 曾 提 及 「 遞 迴 」 (recurrence )的概念在許多演算法的設計及 計數(counting)問題的求解上扮演著重要的 角色。本文延續上文,將透過一些例子來說 明遞迴在計數問題的應用。

數列的表示方式

一個數列(sequence)可以有許多不同的 表示方式。常見的一種方式是列出數列的最 前面幾項,後面的部分則以「. . .」表示,例 如某個數列可能被表示成 3, 5, 7, . . . 這樣的方式很容易造成誤解;除非另外 聲明此數列是等差數列或是滿足其他特定性 質的數列,否則我們無法只根據一個數列的 最前面幾項來推斷它往後的發展。以上面的 例子而言,它除了可能是一個等差數列外, 也可能是由 3 開始的所有質數形成的數列, 或是其他性質較不明顯的數列,因此第四項 有可能是 9 ,或是 1 1 ,或是其他的數。 數列的第二種表示方式是將數列的每一項 都用「通式」來表示,例如將某個數列定義為 an= 3n+5

×

(-1)n, n0 以通式來定義數列的好處是數列的每一 項 都 可 以 很 明 確 地 經 由 一 定 的 算 術 運 算 求 得;以上面的例子而言,此數列的第一項為 a0=3

×

0+5

×

(-1)0=5 第三十項為 a29=3

×

29+5

×

(-1)29= 8 2 有些數列由於性質特殊,要求得通式非 常困難,有時候甚至根本無法求得,不過它 們卻可能可以用另一種方式--遞迴的方式 --來加以定義。我們之前在介紹函數的遞 迴定義時曾經提過,一個遞迴的定義必須包 含遞迴關係(recurrence relation)及邊界條件 (boundary condition)兩個部分。在以遞迴的 方式定義數列時,遞迴關係表明了數列的某 一項與其他項之間的關係,而邊界條件則是 數列最前面幾項的值;由於涉及數列的頭幾 項,因此邊界條件常又稱為「初始條件」 (in-itial condition)。 舉例來說,以下是某個數列的遞迴定義:     ≥ + = = = − − 3 2 3 1 1 1 2 b n b n n b n n n 此定義包含了數列最前面兩項的值(初 始條件),並且表明了往後的每一項如何由 其他項的值求得(遞迴關係)。有了上面的定 義,除了 b1 = 1 及 b2 = 3 為已知外, b3 = b1 + b2 = 1 + 3 = 4 b4 = b2 + b3 = 3 + 4 = 7 b5 = b3 + b4 = 4 + 7 = 11 ...

(2)

依此類推,數列的最前面幾項依序為 1, 3, 4, 7, 11, 18, 29, 47, 76, 123, . . .只要 n 是一個正 整數, bn即可求得。 上面的遞迴關係中,由於必須先求得 bn- 2 與 bn-1才能求得 bn,因此初始條件必須包含數 列的最前面兩項的值,才可以作為往後一系 列計算的起點;如果初始條件只包含數列的 第一項的話是不夠的。讀者不難察覺這個概 念其實和數學歸納法的証明原理相當類似, 遞迴定義的初始條件就相當於數學歸納法的 b a s i s ,而遞迴關係就相當於數學歸納法的 inductive step 。請讀者特別注意遞迴定義的 初始條件必須包含「足夠」的資訊,否則是無 法向後推的,至於要包含數列的最前面多少 項才算「足夠」則要視遞迴關係而定。

例題

問題一: 一個位元(bit )可能是一個 0 或是一個 1;由一連串位元排列而成的字串稱為位元字 串(bit string),而一個位元字串所包含的位 元個數稱為該位元字串的長度。長度為 1 的 位元字串共有兩個:0 與 1;長度為 2 的位元 字串共有四個:00 、 01 、 10 、 11 ;一般而 言,長度為 n 的位元字串共有 2n個。 假設 an代表長度為 n 的位元字串中,不 包含連續兩個 0 的字串的個數,試用遞迴的 方式定義數列 a1, a2, a3, . . .。 解: 長度為 n 的位元字串可分為兩類,一類 是以 1 開頭,另一類是以 0 開頭,如下圖所 示: 如果我們能求出這兩類字串中不包含連 續兩個 0 的字串各有幾個,那麼 an應該就是 這兩數的和。 由上圖不難看出,長度為 n 而且以 1 開頭 的字串中,不包含連續兩個 0 的字串個數應該 就等於長度為 n-1 而且不包含連續兩個 0 的字 串個數,也就是數列的第 n-1 項(即 an-1)的值。 考慮任意一個長度為 n(n≥3)而且以 0 開 頭的字串,如果此字串中不包含連續兩個 0 , 那麼它由左邊算起的第二個位元必定是 1: 由上圖不難看出,長度為 n 而且以 01 開 頭的字串中,不包含連續兩個 0 的字串個數 應該就等於長度為 n-2 而且不包含連續兩個 0 的字串個數,也就是數列的第 n-2 項(即 an -2) 的值。 因此,我們已經找到了一個遞迴關係: an = an-1 + an-2。由於 an的計算牽涉到數列中 的前兩項,因此初始條件必須包含數列的最 前面兩項(也就是 a1與 a2)的值。由題意很 明顯可知 a1 = 2 且 a2 = 3 ,因此完整的遞迴 定義如下:     > + = = = − − 2 2 3 1 2 2 1 a n a n n a n n n 由於遞迴關係是將數列的某一項以其他 項的值表示,因此當我們想要用遞迴的方式

(3)

定義一個數列時,第一個必須問自己的問題 是:如果這個數列的第一項、第二項、... 、 第 n-1 項的值都已知的話,對求出第 n 項有沒 有幫助呢?也就是假設這個數列的第一項至 第 n-1 項都已知,然後想辦法將第 n 項的值利 用這些已知的值表示出來。如果這樣的遞迴 關係真的能被找到,剩下的工作就只是求出 數 列 最 前 面 幾 項 的 值 來 當 做 初 始 條 件 而 已 了,這通常要比找出遞迴關係容易得多。 問題二: 一個由阿拉伯數字(0 ~ 9)排列而成的 字串中, 0 出現的個數不是奇數就是偶數; 例如:字串 503602 中, 0 出現了兩次,因此 0 的個數為偶數;字串 1 2 0 9 8 7 0 4 5 6 0 8 中, 0 出現了三次,因此 0 的個數為奇數。假設 an 代表由 n 個阿拉伯數字排列而成的字串中, 數字 0 出現的個數為偶數的字串的個數,試 用遞迴的方式定義數列 a1, a2, a3, . . .。 解: 長度為 n 的字串可以分為兩類,一類是以 0 開頭,另一類不是以 0 開頭,如下圖所示(圖 中的 X 是不等於 0 的任何一個阿拉伯數字): 如果我們能求出這兩類字串中, 0 出現 的個數為偶數的字串各有幾個,那麼 an應該 就是這兩數的和。 由上圖不難看出,長度為 n 而且以 0 開頭 的字串中, 0 出現的個數為偶數的字串個數 應該就等於長度為 n-1 而且 0 出現的個數為奇 數的字串個數;由於長度為 n-1 的字串總共有 10n -1個而其中 0 出現的個數為偶數的字串共 有 an -1個,因此長度為 n-1 而且 0 出現的個數 為奇數的字串總共有(10n -1 - a n -1)個。 接著考慮長度為 n 而且以 1 開頭的字串的 情況。所有這種字串中, 0 出現的個數為偶 數的字串個數應該就等於長度為 n-1 而且 0 出 現的個數為偶數的字串個數,也就是 an -1。依 此類推,長度為 n 而且以由 2 至 9 的任意一個 數字開頭的字串中, 0 出現的個數為偶數的 字串個數也都是 an -1,因此長度為 n 而且不以 0 開頭的字串中, 0 出現的個數為偶數的字串 總共有 9an-1個。 因此,我們已經找到了一個遞迴關係: an = (10n-1 - a n -1) + 9an-1 = 10n-1 + 8an-1。由於此 遞迴只牽涉到數列中與 an相鄰的前一項,因 此初始條件只須包含數列的第一項(也就是 a1)的值。 由題意很明顯可知 a1 = 9 ,因為長度為 1 的字串總共有十個,這十個字串中除了 0 以 外,其他九個字串的每一個所含的 0 的個數 都是 0 個,而 0 為偶數。 因此完整的遞迴定義如下:    > + = = − − 8 1 10 1 9 1 1 a n n a n n n 讀者不難推導出此數列的通式為 an=5

×

10n-1+4

×

8n -1, n1. 問題三: 假設平面上任意 n 條直線最多可將平面 劃分為 an個區域,試用遞迴的方式定義數列 a0, a1, a2, . . .。 解:

(4)

一個橢圓, a1= 2 根據題意,很明顯, a0 = 1 且 a1 = 2 。 假設平面上已經有 n - 1 條直線而且平面 已經被它們依最大的可能劃分為 an -1個區域。 當我們再加上一條線,使得平面上有 n 條直 線時,這條新的直線最多能讓平面上多出幾 個區域呢? 為了讓區域數盡量多,新加入的直線不能 與任何舊的直線重合,否則對增加區域數沒有 任何幫助。由於任意兩條不重合的直線最多只 有一個交點,因此新加入的直線與原有的 n-1 條直線最多可能交於 n-1 個不同的點(這個情 形發生在新線不與任何舊線平行而且沒有三線 共點的情形時),新的直線因此最多可以被這 n-1 個不同的點分為 n 段;由於這 n 段的每一段 都將一個舊的區域一分為二,因此第 n 條線最 多可以為平面增加 n 個區域;至此,我們有了 一個基本的遞迴關係:an = an - 1 + n 。 由於此遞迴只牽涉到數列中與 an相鄰的 前一項,因此初始條件只須包含數列的第一 項(也就是 a0)的值。完整的遞迴定義如下:    > + = = − 0 0 1 1 n n a n a n n 讀者不難推導出此數列的通式為 1 2 ) 1 ( + + =n n an , n≥0. 問題四: 平面上有 n 個橢圓,這些橢圓中,任意 兩個橢圓都不多不少正好有兩個交點,而且 沒有三個橢圓相交於同一點的情形。假設這 n 個橢圓將平面劃分為 an個區域,試用遞迴的 方式定義數列 a1, a2, a3, . . .(下圖為 n 的值分 別為 1, 2, 3 時的情形)。 解: 假設平面上已經有 n - 1 個橢圓而且平面 已經被它們劃分為 an -1個區域。當我們再加上 一個橢圓,使得平面上有 n 個橢圓時,由於 這個新的橢圓與每個舊的橢圓有兩個交點, 因此新的橢圓與舊的 n-1 個橢圓交於 2( n-1)個 不同的點,新的橢圓被這些點分成了 2( n - 1 ) 段。由於這 2 ( n - 1 ) 段的每一段都會將一個舊 的區域一分為二,因此第 n 個橢圓可以為平 面增加 2 ( n - 1 ) 個區域;至此,我們有了一個 基本的遞迴關係:an = an-1 + 2(n-1)。 由於此遞迴只牽涉到數列中與 an相鄰的 前一項,因此初始條件只須包含數列的第一 項(也就是 a1)的值。完整的遞迴定義如下:    > − + = = − 2( 1) 1 1 2 1 n n a n a n n 讀者不難推導出此數列的通式為 an=n2-n+2 , n≥1. 問題五: 假設 an代表每一項皆為整數而且首項與 兩個橢圓, a2= 4 三個橢圓, a3= 8

(5)

末項分別為 1 與 n 的嚴格遞增數列的個數,試 用遞迴的方式定義數列 a1, a2, a3, . . .。 解: 所有首項為 1 且末項為 n 的嚴格遞增數列 中,末項的前一項共有(n-1) 個可能的值;它 可能是( n -1) ,或是( n -2) ,或是任何一個介於 1 與(n-1)(包括 1 與(n- 1 ) )之間的數。 由於所有首項為 1 且末項為 n 的嚴格遞增 數列中,末項的前一項為 n-1 的數列共有 an - 1 個 , 末 項 的 前 一 項 為 n - 2 的 數 列 共 有 an - 2 個,……,末項的前一項為 1 的數列共有 a1 個,因此,我們有了以下的遞迴關係:

− = − − + + + = = 1 1 1 2 1 n i i n n n a a a a a K 根據題意,很明顯地, a1=1 ,因此完整 的遞迴定義如下:     > = =

− = 1 1 1 1 1 n a n a n i i n 請讀者注意上面的遞迴關係中,雖然 an 的 計 算 涉 及 數 列 中 位 於 an 之前的全部( n - 1 ) 項,但是起始條件只需包含 a1的值就夠了, 因為由 a1可算出 a2,由 a1與 a2可算出 a3,由 a1、 a2與 a3又可算出 a4等;只要 n 是正整數, an即可求得。 上面的遞迴定義並不是唯一的方式;當 n > 2 ,經由簡單的推導: an=an- 1+an -2+. . .+a1 =an -1+(an-2+...+a1) =an -1+an - 1 =2an- 1 我們發現同樣的數列可以用以下更簡潔 的方式來定義:     > = = = − 2 2 2 1 1 1 1 n a n n a n n 由這個定義不難推導出當 n 2 , an=2n-2 這麼簡單的式子當然值得我們探尋是否存在著 一個簡單的解釋;仔細一想,讀者很容易就能 看出其中的道理,因為每個大於 1 且小於 n 的 整數(這樣的整數總共有(n-2)個)都可能出現或 是不出現於一個首項為 1 且末項為 n 的嚴格遞 增數列中,因此總共有 2n -2種不同的情形。 建議讀者試試看從數列的觀點解釋為什 麼 an=2 an -1成立。 問題六: 四個數相乘:x0 . x1 . x2 . x3,如果用小括 號括出可能的計算次序,共有以下 5 種不同 的括法: ((x0 . x1). x2). x3 (x0 . x1). (x2 . x3) (x0 . (x1 . x2)). x3 x0 . ((x1 . x2). x3) x0 . (x1 . (x2 . x3)) 假設 Cn代表 n+1 個數相乘(x0.x1... xn) 時,不同的括法有幾種,試用遞迴的方式定 義數列 C0 ,C1 ,C2, . . .。 解: 不管小括號怎麼括, n + 1 個數相乘必定 牽涉到 n 次的乘法運算。假設最後一次相乘 是發生在 xk與 xk +1之間: 最後一次 將這 n +1 個數依最後一次乘法的位置看

(6)

成是由前後兩段組成,前段有 k+1 個數相乘, 後段則有 n-k 個數相乘。由於 k+1 個數相乘有 Ck種不同的括法且 n-k 個數相乘有 Cn-k-1種不同 的括法,因此如果最後一次相乘是發生在 xk 與 xk +1之間,共有 Ck× Cn - k -1種不同的括法。 最後一次相乘可能發生在許多位置,可 能在 x0與 x1之間、 x1與 x2之間、 x2與 x3間、……、 xn -1與 xn之間等,因此 k 可能的值 最小為 0 ,最大為 n-1 ;n+1 個數相乘,不同 的括法數應該就是以上各個不同位置所對應 到的不同的括法數的總和。因此, Cn =(k = 0 時的括法數)+(k = 1 時的括法 數)+ ... +(k = n - 1 時的括法數) = C0Cn -1 + C1Cn -2 + ... + Cn -1C0 =

− = − − 1 0 1 n k k n kC C 至此,我們已經找到了一個遞迴關係; 至於初始條件,只須包含數列的第一項 C0 = 1 即可,往後的每一項可以由此為起點陸續算 出,例如: C1 = C0C0 = 1 C2 = C0C1 + C1C0 = 1 + 1 = 2 C3 = C0C2 + C1C1 + C2C0 = 2 + 1 + 2 = 5 C4 = C0C3 + C1C2 + C2C1 + C3C0 = 5 + 2 + 2 + 5 = 14 等。 以上由 C0, C1, C2, . . . 形成的數列在數學 上稱為 Catalan numbers ,這個數列的最前面 十項依序為 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796 ,通式則為       + = n n n Cn 2 1 1 , n ≥ 0.

結語

用遞迴的方式定義數列其實和用遞迴的 方式定義函數很類似;數列可以看成是由{ 0 , 1, 2, ...}(或{1, 2, 3, ...})對應到實數或整數 的函數。 數列的遞迴定義方式雖然沒有像用通 式那麼直接了當,但是這種方式可以表示的 數列種類卻比用通式更多,而且在許多情況 下更方便,因為有許多數列的通式是很難求 得的;對於這類數列,當我們想要知道數列 的某一項是多少,常可迂迴地先將該數列以 遞迴的方式定義,再由起始條件開始逐項往 後算出所要的值。 當然,如果我們想要很快地算出數列的 某一項(例如:第一百項)的值,我們會比較 希望該數列是用通式的方式表示,因為這樣 的 話 只 要 經 過 一 定 數 量 的 計 算 就 能 得 到 結 果;如果是用遞迴的方式定義,一個表面上 看起來不複雜的遞迴關係背後卻可能隱含著 可觀的計算量,使得即使是透過電腦快速的 計算能力都不能在短時間內算出結果;因為 這個原因,數學家發展出了許多由遞迴的定 義推導出通式的方法;上篇文章中筆者已經 介紹了一部分這方面的技巧,有機會將另文 介紹。

參考資料

1.許介彥(2001),遞迴函數的求解技巧,科 學教育月刊,第 238 期。

2.Susanna. S. Epp, Discrete Mathematics with Applications, 2nd edition, Brooks/Cole, 1995.

3.Kenneth. H. Rosen, Discrete Mathematics and Its Applications, 4th edition,

McGraw-Hill, 1999.

參考文獻

相關文件

W EN -C HING L IEN Department of Mathematics National Cheng Kung

Department of Mathematics National Cheng Kung

Mathematica 5.0 (Wolfram 2003) 是一個強大的數值、 符號運算、 繪圖整合系統, 具有 高階程式語言能力的數學軟體。 它新增一個強大的內建命令 RSolve, 可以解遞迴方程。 在

Waddill, Using matrix techniques to establish properties of a generalized Tri- bonacci sequence, In: Application of Fibonnaci Numbers, Vol 4, G.E.. Bergun etal, Eds.,

公職人員利益衝突迴避法第 14 條第 2

When we know that a relation R is a partial order on a set A, we can eliminate the loops at the vertices of its digraph .Since R is also transitive , having the edges (1, 2) and (2,

W EN -C HING L IEN Department of Mathematics National Cheng Kung

W EN -C HING L IEN Department of Mathematics National Cheng Kung