《具體數學》經過三個例子來說遞歸,分別是:Hanoi Tower(漢諾塔)、Lines in the Plane(平行中的直線)、Josephus Circle(約瑟夫環問題)算法
這三個例子一直被數學家們反覆研究;已知解法都使用遞歸,大問題化爲小問題;均可以用計算機程序來求解;
我最近由於考試忙的其實也沒看幾頁,就先把看的寫出來吧;spa
1.1 漢諾塔遞歸
首先來看被稱爲「漢諾塔」(Hanoi Tower)的智力問題。該問題是法國數學家Edouard Lucas在1883年提出的。給定一個由八個大小不一樣的圓盤組成的塔,最初圓盤按尺寸遞減的次序自底而上地堆放到三根杆中的一根上。相似的問題是婆羅門 塔(64個盤子,一直挪到世界末日……,後面咱們有相關的分析)
數學
目標:把整個塔從一根杆移到另外一根杆上。
規則:
(1)One time, one disk;
(2)No larger disks on smaller ones, Anytime.
直觀上很難看出這個問題的解法,可是咱們之前在C語言的遞歸部分已經遇到過,能夠確信它有一個解.(結尾會給出c語言的代碼片斷)io
書上寫的解法其實已經很清楚了,目的是讓咱們求Tn是在Lucas規則下n個盤從一根杆移到另外一根杆的最小移動次數,當n=1時顯然 T1=1,T2=3,這些都是小的問題,咱們也能夠經過小的問題去考慮大的,咱們如何能轉移一個大的塔?3個盤的實驗代表要想獲勝就是把頂上的2個移到中 間,而後移第3個盤,再把另外的2個盤放上去,再擴展到n個盤通常移動的思路:首先把n-1個最小的盤轉移到一個不一樣的杆(Tn-1次移動),而後移動最 大的盤(一次移動),最後再把n-1個最小盤上的轉移回最大的盤上(Tn-1次移動),因此,至多用2Tn-1+1次移動能轉移n個盤(n>0)微博
Tn<=2Tn-1+1(n>0)計算機科學
注意紅色的部分,此公式用了'<='而不是'=',這本書真的是很嚴謹啊,因 爲咱們的構造僅證實2Tn-1+1次移動是充分的,並未證實2Tn-1+1次移動是必要的。其實,沒有很好的方法去證實它是必要的.在某個時刻咱們必定要 移動最大的盤,當咱們移動最大盤時,n-1個最小的盤必定在一根杆上,且至少用Tn-1次移動把它們放到那裏,咱們假如不注意,則移動最大盤等等次數可能 大於一次。但最後一次移動最大盤以後,咱們必定要把n-1個最小盤轉移回最大盤上,還要Tn-1次移動。所以Tn>=2Tn-1+1(n>0)擴展
因此漢諾塔遞歸公式爲:程序
T0=0方法
Tn=2Tn-1+1(n>0)
它給定一個邊界值以及根據較早值表達通常值一個方程。咱們有時把這個通常方程單獨稱爲一個遞歸,但其實仍是要一個邊界值。
怎麼去理解 遞歸呢,先去猜想一個正確的解,而後由這個解推出通解,找出規律,最後去證實規律的廣泛性,數學概括法是證實某個命題關於(對全部n>=n0)成立 的一種通常方法,其實數學概括法完美爲遞歸做了準備。書上有一段是真的很重要的,在各類應用提出的許多問題中,漢諾塔的遞歸具備典型性,在找出像Tn那樣 表達式,咱們經歷三個階段:
1:看看小的情形,這能使咱們更深刻的瞭解問題
2:求出和證實關心量的一個數學表達式,它使咱們能就給定的量來計算任何n的Tn
3:求出和證實咱們的數學表達式的一個閉形式
其實根據咱們高中所學的知識,咱們能夠對Tn進行簡化的:
T0+1=1;
Tn+1=2Tn-1+2,Un=2Un-1;
等比數列
漢諾塔C語言程序片斷:#include <stdio.h>
int hanoiSolver(int peg1, int peg2, int peg3, int dCount)
{
int mCount = 0;
if (dCount > 1) {
mCount += hanoiSolver(peg1, peg3, peg2, dCount - 1);
printf("Move the top disk : peg %d -> peg %d\n", peg1, peg3);
mCount += hanoiSolver(peg2, peg1, peg3, dCount - 1);
} else {
printf("Move the top disk : peg %d -> peg %d\n", peg1, peg3);
}
return ++mCount;
}
下一篇估計得有段時間去寫了,每天考試,下一篇是打算寫Lines in the Plane(平行中的直線)問題
總 結:因爲最近一直忙於複習考試,看的不多,但已經看完第一章了,課後習題還沒寫(感受是在被教怎麼作人了),真的寫的很精彩,對於有些問題感到很神奇,對 於不少解題思路很方法感受仍是有點吃力去理解,頁邊的塗鴉也很嗨啊,大師的公式推導,絕妙方法,真的讓我醉了,醉的不行了,最後附上我在微博上看到的一 句,我以爲頗有道理:
算法和彙編,這纔是計算機科學。低頭製造垃圾簡直暴殄天物。。。。。