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

《具體數學》經過三個例子來說遞歸,分別是: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(平行中的直線)問題

總 結:因爲最近一直忙於複習考試,看的不多,但已經看完第一章了,課後習題還沒寫(感受是在被教怎麼作人了),真的寫的很精彩,對於有些問題感到很神奇,對 於不少解題思路很方法感受仍是有點吃力去理解,頁邊的塗鴉也很嗨啊,大師的公式推導,絕妙方法,真的讓我醉了,醉的不行了,最後附上我在微博上看到的一 句,我以爲頗有道理:

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

相關文章
相關標籤/搜索