1.漢諾塔問題描述:
有3根柱子a,b,c,a柱上有n個盤子,盤子的大小不等,大的盤子在下,小的盤子在上。
要求將a柱上的n個盤子移到c柱上,每次只能移動乙個盤子。
在移動過程中,可以借助於任何一根柱子(a、b、c),但必須保證3根柱子上的盤子都是大的盤子在下,小的盤子在上。
2.源程式:
注:源程式中的x,y,z分別代表題目要求中的a,b,c,下面是遞迴和非遞迴演算法
#include
#define maxstack 10 /* 棧的最大深度*/
int c = 1; /* 乙個全域性變數,表示目前移動的步數*/
struct hanoi ;
void move(char x, int n, char y) /* 移動函式,表示把某個盤從某根針移動到另一根針*/
///*把x柱上的n個盤子借助於y柱移到z柱上*/
void hanoi(int n, char x, char y, char z) /* 漢諾塔的遞迴演算法*/
} void push(struct hanoi *p, int top, char x, char y, char z,int n)
void unreverse_hanoi(struct hanoi *p) /* 漢諾塔的非遞迴演算法*/
if (p[top].n == 1)
if (top >= 0) }
}int main(void)
程式的執行結果如下所示:
reverse program:
1. move disk 1 from x to z
2. move disk 2 from x to y
3. move disk 1 from z to y
4. move disk 3 from x to z
5. move disk 1 from y to x
6. move disk 2 from y to z
7. move disk 1 from x to z
unreverse program:
1. move disk 1 from x to z
2. move disk 2 from x to y
3. move disk 1 from z to y
4. move disk 3 from x to z
5. move disk 1 from y to x
6. move disk 2 from y to z
7. move disk 1 from x to z
press any key to continue
3.起源:
漢諾塔是源自印度神話裡的玩具。
如果移動乙個圓盤需要1秒鐘的話,等到64個圓盤全部重新落在一起,宇宙被毀滅是什麼時候呢?
漢諾塔與宇宙壽命
讓我們來考慮一下64個圓盤重新摞好需要移動多少次吧。1個的時候當然是1次,2個的時候是3次,3個的時候就用了7次......這實在是太累了
因此讓我們邏輯性的思考一下吧。
4個的時候是
「3個圓盤重新摞在一起的次數」+1次+「3個圓盤重新摞在一起需要的次數」
=2x「3個圓盤重新摞在一起的次數」+1次
=15次。
那麼,n個的時候是
2x「(n-1)個圓盤重新摞在一起的次數」+1次。
由於1 個的時候是1次,結果n個的時候為(2的n次方減1)次。
1個圓盤的時候2的1次方減1
2個圓盤的時候2的2次方減1
3個圓盤的時候2的3次方減1
4個圓盤的時候2的4次方減1
5個圓盤的時候2的5次方減1
........
n個圓盤的時候2的n次方減1
也就是說,n=64的時候是(2的64次方減1)次。
因此,如果移動乙個圓盤需要1秒的話,
宇宙的壽命=2的64次方減1(秒)
2的64次方減1到底有多大呢?動動計算器,答案是乙個二十位的數字:
18446744073709551615!
用一年=60秒x60分x24小時x365天來算的話,大約有5800億年吧。
據說,現在的宇宙年齡大約是150億年,還差得遠呢。
漢諾塔問題在數學界有很高的研究價值,
而且至今還在被一些數學家們所研究,
漢羅塔問題
漢羅塔的移動序列為2 n 1 次 漢羅塔問題的遞迴解 演算法目的 把是start柱子上的木塊移動到end柱子上 當start柱子上只有兩個圓環時,把兩個圓環放到end柱子上要借助middle柱子,這樣start柱子上有n個圓環時,要先把第n個圓環上的n 1各圓環移動到middle柱子上,然後再把第n...
怎麼理解漢羅塔問題 教你輕鬆理解漢諾塔問題
漢諾塔的解決在程式裡實際上是乙個函式遞迴呼叫的過程。假設a上有 n個盤子,求解的大 致想法是想把 a最上面的 n 1個盤子借助c挪到 b,接著把 a最下面的最大的盤子挪到 c,再把b上的 n 1個盤子借助a挪到 c,完成。首先先看 c 裡解決這個問題的 using system using syst...
漢羅塔動畫實現
import turtle class stack def init self self.items def isempty self return len self.items 0 def push self,item def pop self return self.items.pop def ...