《具體數學》1.1遞歸(一)

《具體數學》通過三個例子來講遞歸,分別是:Hanoi Tower(漢諾塔)、Lines in the Plane(平行中的直線)、Josephus Circle(約瑟夫環問題)

這三個例子一直被數學家們反覆研究;已知解法都使用遞歸,大問題化爲小問題;都可以用計算機程序來求解;
我最近因爲考試忙的其實也沒看幾頁,就先把看的寫出來吧;

1.1 漢諾塔

首先來看被稱爲“漢諾塔”(Hanoi Tower)的智力問題。該問題是法國數學家Edouard Lucas在1883年提出的。給定一個由八個大小不同的圓盤組成的塔,最初圓盤按尺寸遞減的次序自底而上地堆放到三根杆中的一根上。類似的問題是婆羅門塔(64個盤子,一直挪到世界末日……,後面我們有相關的分析)

目標:把整個塔從一根杆移到另一根杆上。
規則:
(1)One time, one disk;
(2)No larger disks on smaller ones, Anytime.
直觀上很難看出這個問題的解法,但是我們以前在C語言的遞歸部分已經遇到過,可以確信它有一個解.(結尾會給出c語言的代碼片段)

書上寫的解法其實已經很清楚了,目的是讓我們求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(平行中的直線)問題
總結:由於最近一直忙於複習考試,看的很少,但已經看完第一章了,課後習題還沒寫(感覺是在被教怎麼做人了),真的寫的很精彩,對於有些問題感到很神奇,對於很多解題思路很方法感覺還是有點吃力去理解,頁邊的塗鴉也很嗨啊,大師的公式推導,絕妙方法,真的讓我醉了,醉的不行了,最後附上我在微博上看到的一句,我覺得很有道理:

算法和彙編,這纔是計算機科學。低頭製造垃圾簡直暴殄天物。。。。。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章