引子
著名的 Hanoi 問題是這樣描述的:
[1]
漢諾塔
(港臺:
河內塔
)是根據一個傳說形成的數學問題:
有三根杆子
。
杆上有
個 (
) 穿孔圓盤,盤的尺寸由下到上依次變小。要求按下列規則將所有圓盤移至
杆:
每次只能移動一個圓盤;
大盤不能疊在小盤上面。
提示:可將圓盤臨時置於
杆,也可將從
杆移出的圓盤重新移回
杆,但都必須遵循上述兩條規則。
問:如何移?最少要移動多少次?
Hanoi問題圖示
八塊圓盤的Hanoi玩具
解:
記
是
個圓盤需要從
搬到
柱所需的最小次數。整個搬運過程可以分為三個階段
將上面的
個盤從
移動到
將最下面的第
個盤從
移動到
將
個盤從
移動到
那麼就有下面的等式成立
這個等式的意思就是:
個圓盤從
移動到
的次數=
個盤從
移動到
次數+ 第
個盤移動到
次數+
個盤從
移動到
次數
個圓盤從
移動到
的次數=
個盤從
移動到
次數=
個盤從
移動到
次數=
第
個盤移動到
次數=
也不難理解,如果只有一個盤子,那麼我直接
即可,即
這就是一個遞迴式出現了
這個遞迴式求出來了,那麼怎麼求解呢?
還有一個著名的斐波那契數
[2]
根據高德納(Donald Ervin Knuth)的《計算機程式設計藝術》(
The Art of Computer Programming
),1150年印度數學家Gopala和金月在研究箱子包裝物件長寬剛好為1和2的可行方法數目時,首先描述這個數列。在西方,最先研究這個數列的人是比薩的列奧那多(義大利人斐波那契Leonardo Fibonacci),他描述兔子生長的數目時用上了這數列:
兔子的數量就是斐波那契數
第一個月初有一對剛誕生的兔子
第二個月之後(第三個月初)它們可以生育
每月每對可生育的兔子會誕生下一對新兔子
兔子永不死去
假設在
月有兔子總共
對,
月總共有
對。在
月必定總共有
對:因為在
月的時候,前一月(
月)的b對兔子可以存留至第
月(在當月屬於新誕生的兔子尚不能生育)。而新生育出的兔子對數等於所有在
月就已存在的
對。
這個問題可以來畫個表
[3]
兔子數量變化
最終可以得到遞推式:
這個遞推關係又怎麼求解呢?
這就是接下來要說的東西了。
常係數線性齊次遞推關係的求解
定義
設
是給定的正整數,若數列
的相鄰
項之間滿足關係
對
成立。
若
,則稱該關係為
的
階線性遞推關係。
若滿足1的情況下,還滿足
都是常數,則成之為為
階常係數線性遞推關係。
若滿足1,2的情況下,還滿足
,則稱其為
階常係數齊次線性遞推關係。
這個定義和微分方程的定義十分類似,只不過把導數的階次換成了遞推的階次。
例子
求解斐波那契數列遞推式的解
列特徵方程:
,求解得到
遞迴方程的通解為
帶入邊界條件
,得到線性方程組
求解得到
這個也就是在鄧俊輝版的資料結構
[4]
第25頁推匯出來的結果。
求解遞推關係
列特徵方程
,求解得到
遞迴方程的通解為
帶入邊界條件
,得到線性方程組
求解得到
求解
對於這個方程,要先把它化成一個變數的遞推方程,由遞推式可知
,所以有下列關於
的遞推式:
這個求解就跟之前的一模一樣了。
列特徵方程:
,根為
遞迴方程的通解為:
根據邊界條件列出線性方程組:
求解總結
對於
常係數線性齊次
遞推方程
的求解步驟如下
列出特徵方程:
,設求解的解為
寫出帶係數的通項公式:
代入
邊界條件
,或者叫
遞迴基
,得到一個關於
的線性方程組,要想有唯一解要求邊界條件的數目和冪次一致,這個原因學過線性代數肯定是沒有問題的
證明過程可以參考組合數學引論
[5]
,寫的比較清楚。
其實證明過程也可以參考微分方程的求解,兩個的求解方式有很多的相似之處。
常係數非齊次遞推關係的求解1-利用已知的解形式
定義
前面看了常係數齊次遞迴,知道了齊次是因為
,那麼
就是非齊次了。
非齊次通常是沒有普遍的解法的。
書上會給一些關於特殊的
的解的形式,但是記憶起來比較麻煩,很容易記錯,推薦碰到非齊次的時候考慮使用生成函式來解題。生成函式的作用比記憶這些特殊解的構造要有用的多。
對於非齊次線性遞推方程寫 2 個例子。
例子
求解 Hanoi 遞推式
代表通解,
代表通解。
對於其對應的齊次線性遞迴式列特徵方程:
計算特解:
,對應著有
這樣形式的解的
,將
代入特徵多項式,得到
(這個特徵多項式就是前面的特徵方程的去掉0的一個函式)。根據書上
[5]
的特解形式的對應,
對應的特解形式為
,所以特解為
,這裡可以看出來,
的取值和
無關,所以
,將其帶入遞推方程
因此,特解為
,綜合非齊次特解和齊次通解可知
,代入邊界條件,有
,所以,遞推關係為
總結
求解非齊次遞推關係的解的時候,要先求解出對應的齊次方程帶係數的通解
觀察非齊次項
的表示式是否是特殊的表示式,如果是,根據已知的特解的表達形式得到帶係數的特解
將帶係數的特解直接帶入遞推關係,代入邊界條件得到特解的係數,得到不帶係數的特解
將帶係數的通解和特解相加
帶入原來的遞推表示式中,根據邊界條件求出解的係數,這時候去掉係數的解就是遞推表示式的解。
常係數非齊次遞推關係的求解2-使用生成函式
如果不知道生成函式(或者母函式)是什麼,應該先補一下這方面的知識。
例子
還是來求解前面的 Hanoi 問題
總結
先寫到這兒,有空有人看了再往下面寫。
分析遞迴
程式實現
複雜度分析
遞迴與迭代的轉化
關係
轉化方法
參考
^
Hanoi問題維基百科
https://zh。wikipedia。org/wiki/%E6%B1%89%E8%AF%BA%E5%A1%94
^
Fibonacci
https://zh。wikipedia。org/wiki/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97
^
陳景潤。組合數學
https://book。douban。com/subject/10808577/
^
鄧俊輝。資料結構
https://book。douban。com/subject/25859528/
^
a
b
組合數學引論
https://book。douban。com/subject/4867855/