經典問題 漢諾塔(遞迴)

2021-10-17 11:05:52 字數 1741 閱讀 8569

c++**如下:

法國數學家愛德華·盧卡斯曾編寫過乙個印度的古老傳說:在世界中心貝拿勒斯(在印度北部)的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有乙個僧侶在按照下面的法則移動這些金片:一次只移動一片,不管在哪根針上,小片必須在大片上面。僧侶們預言,當所有的金片都從梵天穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消滅,而梵塔、廟宇和眾生也都將同歸於盡。

首先有n個不同大小的盤子和3根木樁。一開始,所有的盤子都按照大小順序套在第1根木樁上,最大的盤子在底部,最小的盤子在頂部。問題的要求是把所有的盤子都移到第3根木裝上去,在必要的時候可以借助第2根木樁。每次只能移動乙個盤子,並且不能把較大的盤子放在較小的盤子上面。

為了把n>1個盤子從第1根木樁移到第3根木樁上(借助第2根木樁),我們需要先把n-1個盤子遞迴地從木樁1移到木樁2(借助木樁3),然後直接把最大的盤子(即第n個盤子)從木樁1移到木樁3,並且,最後把n-1個盤子遞迴地從木樁2移到木樁3(借助木樁1)。當然,如果n=1,我們只需要把這個唯一的盤子直接從乙個木樁移到另乙個木樁。

動畫演示如下:

顯然,盤子的數量n作為輸入規模的乙個指標,盤子的移動也可以作為該演算法的基本操作。我們可以清楚地看到,移動的次數m(n)只依賴於n,因此,對於m(n)有下列遞推等式:

當n>1時,m(n)=m(n-1)+m(n-1)+1

另乙個很明顯的事實是初始條件m(1)=1,因此,對於移動次數m(n)我們可以建立如下的遞推關係:

當n>1時,m(n)=2m(n-1)+1

m(1)=1

對於上面的遞推式,我們可以運用反向替換法求解:注意此處不要輕易合併,否則會找不到規律

m(n)=2m(n-1)+1 將m(n-1)替換為2m(n-2)+1

=2[2m(n-2)+1]+1=22m(n-2)+2+1

=22[m(n-3)+1]+2+1=23m(n-3)+22+2+1

對以上模式進行一般化處理,在做了i次替換之後,得到下式:

m(n)=2im(n-i)+2i-1+2i-2+…+2+1=2im(n-i)+2i-1

因為初始條件是在n=1的情況下確立的,所以必須讓i=n-1,再代入到上面經過一般化處理之後的模式中,得到

m(n)=2n-1

不難看出,我們得到了乙個指數級的演算法,即使n的值不算大,該演算法的執行時間也會長的無法想象。但這並不意味著該演算法不是乙個好的演算法。不難證明,對於這個問題(漢諾塔問題)來說,這是可能提供的最高效的演算法了。事實上,是這個問題本身決定了它在計算上的難度。儘管如此,這個經典的問題還為我們揭示了乙個具有普遍意義的重要觀點:

我們應該謹慎使用遞迴演算法,因為它們的簡潔可能會掩蓋其低效率的事實。

#includeusing namespace std;

int n;

void move(char x,char y)

本文引例及演算法總結**於-----the design and analysis of algorithms third edition(演算法設計與分析基礎 第3版)

經典遞迴問題 漢諾塔

漢諾塔 漢諾塔問題第一次接觸時就感覺非常有趣,但是由於當時知識有限不能深刻地理解遞迴的含義,所以沒能繼續深究,現在來談一談吧。題目描述 漢諾塔 於印度傳說的乙個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從上往下從小到大順序摞著64片 圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在...

經典遞迴 漢諾塔問題

有三個柱子,三個盤子都在第乙個柱子上,現在要移到第三個柱子上,要求移動過程中盤子相對位置不變,小的還是在上,大的在下。思路 分兩步 1.將n 1個盤從乙個柱子移到另乙個柱子 借助另外乙個柱子 n 1 2.將1個盤子從乙個柱子移到另乙個柱子 用3個柱子移動n 1個盤子,目的 把所有盤子從x移到z vo...

漢諾塔 經典遞迴問題

漢諾塔問題是乙個經典的遞迴問題,大意是 有a,b,c三根柱子,a柱上有n個盤子,小的在上,大的在下,現在要在b柱的幫助下將a柱上的所有盤子移動到c柱上,而且要求每次只能移動乙個,並且任何時候小的盤子只能在大的盤子上面。利用遞迴逐步分解問題的思想可以輕鬆解決這道題。首先考慮只有乙個圓盤 n 0 的情況...