漢羅塔問題

2021-06-22 01:50:15 字數 2268 閱讀 5903

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 ...