移動多少盤子才能完成漢諾塔遊戲

2022-08-12 06:39:15 字數 960 閱讀 1673

漢諾塔(又稱河內塔)問題是印度的乙個古老的傳說。在乙個廟裡有三根金剛石棒,第一根上面套著 64 個圓的金片,最大的乙個在底下,其餘乙個比乙個小,依次疊上去,廟裡的眾僧不停地把它們乙個個地從這根棒搬到另一根棒上,規定可利用中間的一根棒作為輔助,但每次只能搬乙個,而且大的不能放在小的上面。經過運算移動圓片的次數為 18446744073709551615,看來眾僧們耗盡畢生精力也不可能完成金片的移動。

後來,這個傳說就演變為漢諾塔遊戲,遊戲規則如下:

1)有三根柱子 a、b、c,a 柱上有若干盤子;

2)每次移動一塊盤子,小的只能疊在大的上面;

3)把所有碟子從 a 柱全部移到 c 柱上;

4)經過研究發現,漢諾塔的破解很簡單,就是按照移動規則向乙個方向移動金片;

5)例如 3 階漢諾塔的移動:a→c,a→b,c→b,a→c,b→a,b→c,a→c。

此外,漢諾塔問題也是程式設計中的經典遞迴問題。

如果柱子標為 abc,那麼要由 a 搬至 c,在只有乙個盤子時,就將它直接搬至 c,當有兩個盤子時,就將 b 當作輔助柱。如果盤數超過 2 個,那麼將第三個以下的盤子遮起來,就很簡單了,每次處理兩個盤子,也就是:a->b、a->c、b->c 這三個步驟,而被遮住的部分,其實就是進入程式的遞迴處理。事實上,若有 n 個盤子,則移動完畢所需次數為 2n-1,所以當盤數為 64 時,則所需次數為:264-1=18446744073709551615,如果對這數字沒什麼概念,那麼可以假設每秒鐘搬乙個盤子,也要約 5850 億年。

實現**如下:

程式的執行結果為

function hanoi($n, $x, $y, $z)到\n";

return;

}hanoi($n-1, $x, $z, $y);

echo "移動片從到\n";

hanoi($n-1, $y, $x, $z);

}hanoi(3,'a','b','c');

漢諾塔問題(移盤子)

首先來簡單舉例 當個數為1時,只需要把盤子移動一次 當個數為2時,需要先將第乙個放在右邊,把第二個放在中間,再把第乙個放回中間 當個數為3時,考慮 先將前兩個放到右邊,相當於個數為2時的步驟 然後把第三個放到中間 然後把右邊兩個放到中間,這個步驟和個數為2相同 得出結果 7次 類推可知 當個數為n時...

漢諾塔移動

漢諾塔的移動可以用遞迴函式非常簡單地實現。請編寫move n,a,b,c 函式,它接收引數n,表示3個柱子a b c中第1個柱子a的盤子數量,然後列印出把所有盤子從a借助b移動到c的方法,例如 期待輸出 a c a b c b a c b a b c a c move 3,a b c 乙個環 ste...

漢諾塔遊戲

漢諾塔 於印度傳說的乙個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從下往上按大小順序摞著64片 圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一回只能移動乙個圓盤。要想玩轉漢諾塔,需要先理解遞迴。如果乙個問題可以不斷地...