171028 經典遞迴問題 漢諾塔(自寫分析)

2021-08-09 22:35:18 字數 1375 閱讀 7216

楔子:高中搞奧數的時候就對這種遞迴的東西很頭大。總是想幾步就感覺腦子記憶體已經溢位了。。昨晚最初看到這個問題還是沒搞明白,書上給的**看了就更糊塗。今早趁精神好想明白了這個問題的解決辦法(所謂遞迴)。但還是沒看懂**。那就自己寫一遍唄,果然奏效。

原理:

遞迴的乙個特點是,把很大的n階問題一步步分解,直到成為乙個可以很容易解決的小問題。

想想斐波那契,計算n項時需要n-1和n-2,這就需要n-2和n-3……有限步之後,即可得到純粹由我們已知的1和2作為全部所需條件的式子。

但斐波那契只要加法。你覺得很容易理解。

而漢諾塔所做的事情非數學語言(加減乘除)所描述,所以你思維轉不過來了。。

但其實原理是一樣的。

當n=1時,只需要從將a塔上的乙個盤子移到c塔上。直接移就好。

當n=2時,先將a塔上的1號盤子(編號從上到下)移動到b塔上,再將a塔上的2號盤子移動的c塔上,最後將b塔上的小盤子移動到c塔上。

當n=3時,先將a塔上編號1至2的盤子(共2個)移動到b塔上(需借助c塔,這時的說法只是思路,已經不是具體辦法,具體辦法看n=2時的情況,不過輔助塔和目標塔互換),然後將a塔上的3號最大的盤子移動到c塔,最後將b塔上的兩個盤子借助a塔移動到c塔上。

當有n個時,先將a塔上編號1至n-1的盤子(共n-1個)移動到b塔上(借助c塔),然後將a塔上最大的n號盤子移動到c塔上,最後將b塔上的n-1個盤子借助a塔移動到c塔上。

綜上所述,除了只有乙個盤子時不需要借助其他塔外,其餘情況均一樣(只是事件的複雜程度不一樣)。

我們可以倒著想:

也就是說,當有n個時,由於遊戲規則,最終必定將第n塊由a搬到c,因為這一塊最大,無法進行中轉;同時,當移動n時,a塔只有n,c塔空,則b塔有1~n-1,且按唯一順序(由小到大)排列。

接下來的問題是:1~n-1是怎麼從a到b的?此時將b看作目標塔,c作為輔助塔。這個問題就變成了n-1時的情況。。

接著刨下去,我們就能夠得到僅需解決n=1的情況,由此解決1~n-1運到b的問題

然後別忘了還要把這n-1塊從b借a搬到c。而這不過是上述問題把初始塔和輔助塔互換而已。

**:

//漢諾塔問題。既然你現在感覺自己明白原理了,就自己寫出來唄。

#include

using

namespace

std;

int move(int n,char a,char b,char c);

int main()

int move(int n,char a,char b,char c)

}

p.s. 看明白永遠不等於掌握,函式怎麼說也看了三天,動手寫**還是畏手畏腳。

函式宣告可不可以把引數名寫出來?引數是怎麼輸入被呼叫函式的?etc…..

經典遞迴問題 漢諾塔

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

經典問題 漢諾塔(遞迴)

c 如下 法國數學家愛德華 盧卡斯曾編寫過乙個印度的古老傳說 在世界中心貝拿勒斯 在印度北部 的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有乙個僧侶在按照下面的法則移動這些金片 一次只...

經典遞迴 漢諾塔問題

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