經典漢諾塔問題分析

2021-08-04 11:19:32 字數 2487 閱讀 3842

漢諾塔**於印度傳說的乙個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從上往下從小到大順序摞著64片**圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一回只能移動乙個圓盤,只能移動在最頂端的圓盤。有預言說,這件事完成時宇宙會在一瞬間閃電式毀滅。也有人相信婆羅門至今仍在一刻不停地搬動著圓盤。恩,當然這個傳說並不可信,如今漢諾塔更多的是作為乙個玩具存在。

現在有n個圓盤從上往下從小到大疊在第一根柱子上,要把這些圓盤全部移動到第三根柱子要怎麼移動呢?請找出需要步驟數最少的方案

因此我們可以將問題簡化描述為:n個盤子和3根柱子:a(源)、b(備用)、c(目的),盤子的大小不同且中間有一孔,可以將盤子「串」在柱子上,每個盤子只能放在比它大的盤子上面。起初,所有盤子在a柱上,問題是將盤子乙個乙個地從a柱子移動到c柱子。移動過程中,可以使用b柱,但盤子也只能放在比它大的盤子上面。

因此我們得出漢諾塔問題的以下幾個限制條件:

1.在小圓盤上不能放大圓盤。

2.在三根柱子之間一回只能移動乙個圓盤。

3.只能移動在最頂端的圓盤。

首先,我們從簡單的例子開始分析,然後再總結出一般規律。

當n = 1的時候,即此時只有乙個盤子,那麼直接將其移動至c即可。移動過程就是 a -> c

當n = 2的時候,這時候有兩個盤子,那麼在一開始移動的時候,我們需要借助b柱作為過渡的柱子,即將a柱最上面的那個小圓盤移至b柱,然後將a柱底下的圓盤移至c柱,最後將b柱的圓盤移至c柱即可。那麼完整移動過程就是a -> b , a -> c , b -> c

當n = 3的時候,那麼此時從上到下依次擺放著從小到大的三個圓盤,根據題目的限制條件:在小圓盤上不能放大圓盤,而且把圓盤從a柱移至c柱後,c柱圓盤的擺放情況和剛開始a柱的是一模一樣的。所以呢,我們每次移至c柱的圓盤(移至c柱後不再移到其他柱子上去),必須是從大到小的,即一開始的時候,我們應該想辦法把最大的圓盤移至c柱,然後再想辦法將第二大的圓盤移至c柱......然後重複這樣的過程,直到所有的圓盤都按照原來a柱擺放的樣子移動到了c柱。

那麼根據這樣的思路,問題就來了:

如何才能夠將最大的盤子移至c柱呢?

那麼我們從問題入手,要將最大的盤子移至c柱,那麼必然要先搬掉a柱上面的n-1個盤子,而c柱一開始的時候是作為目標柱的,所以我們可以用b柱作為"暫存"這n-1個盤子的過渡柱,當把這n-1的盤子移至b柱後,我們就可以把a柱最底下的盤子移至c柱了。

而接下來的問題是什麼呢?

我們來看看現在各個柱子上盤子的情況,a柱上無盤子,而b柱從上到下依次擺放著從小到大的n-1個盤子,c柱上擺放著最大的那個盤子。

所以接下來的問題就顯而易見了,那就是要把b柱這剩下的n-1個盤子移至c柱,而b柱作為過渡柱,那麼我們需要借助a柱,將a柱作為新的"過渡"柱,將這n-1個盤子移至c柱。

根據上面的分析,我們可以抽象得出這樣的結論:

漢諾塔函式原型:

[cpp]view plain

copy

print?

void hanio(int n,char start_pos,char tran_pos,char end_pos)  

void hanio(int n,char start_pos,char tran_pos,char end_pos)
那麼我們把n個盤子從a柱移動至c柱的問題可以表示為:

hanio(n,a,b,c);

那麼從上面的分析得出:

該問題可以分解成以下子問題:

第一步:將n-1個盤子從a柱移動至b柱(借助c柱為過渡柱)

第二步:將a柱底下最大的盤子移動至c柱

第三步:將b柱的n-1個盤子移至c柱(借助a柱為過渡柱)

因此完整**如下所示:

[cpp]view plain

copy

print?

#include

int i;    //記錄步數

//i表示進行到的步數,將編號為n的盤子由from柱移動到to柱(目標柱)

void move(int n,char from,char to)  

//漢諾塔遞迴函式

//n表示要將多少個"圓盤"從起始柱子移動至目標柱子

//start_pos表示起始柱子,tran_pos表示過渡柱子,end_pos表示目標柱子

void hanio(int n,char start_pos,char tran_pos,char end_pos)  

else  

}  int main()  

return 0;  

}  

經典漢諾塔問題

這幾天在家看完了 程式設計師的數學 這本書,裡面的內容深入淺出比較容易理解,將乙個個晦澀的數學概念用經典例題講解,使人不覺得枯燥。這本書看第一遍有兩處地方卡殼,不是很懂,再看第二遍大致能捋清了,其中乙個就是我這篇文章要講的經典漢諾塔問題。漢諾塔是乙個由數學家愛德華 盧卡斯 edward lucas ...

經典遞迴問題 漢諾塔

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

經典問題 漢諾塔(遞迴)

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