漢諾塔(又稱河內塔)問題是源於印度一個古老傳說。大梵天創造世界的時候作了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞着64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序從新擺放在另外一根柱子上。而且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤,利用函數,實現N片盤的漢諾塔的移動步驟算法
算法理解:bash
理解1:ide
宏觀上咱們能夠這樣理解:要將A上的n個盤子按照要求移動到C上,咱們能夠想到:將上邊的 n-1 的盤子移動到B上,將上邊的 n-2 個盤子移動到A,再將B上盤子移動到C上,而後將A上全部的盤子移動到C上,B作爲踏板,這是比較簡單的理解,可是對於算法實現的過程,仍是沒有弄透徹。函數
理解2:spa
咱們知道當盤子數爲n時,移動的次數應該爲 2^n-1;這個有公式 H(n) = 2H(n-1) +1 得來,理解爲:上邊的n-1個盤子先翻轉到B上,將最大的盤子移動到C上,花費1步,而後將B上的盤子翻轉到C上,花費2H(n-1)步。input
後來美國的一位學者發現一種出人意料的簡單的算法,只要輪流兩步操做既能夠實現:首先,把三張桌子按順序首尾相接的排列,造成一個環,而後對A上的盤子開始移動,順時針擺放成 A B C的順序:it
若n爲奇數,圓盤的移動順序是 A->C->B->A->C->B->A......... 即 間隔兩個步長移動 。此處的n表明盤子位的層數,好比說 3 層漢諾塔就是從下往上數第一、3 個盤子移動的順序。class
若n爲偶數,圓盤移動的順序爲A->B->C->A->B->C->A..........即 間隔一個步長移動。對n的解釋同上 第二個盤子移動 A->B->C。變量
下邊是兩種相似的解題思路,惟一不一樣的是,三個位置變量的順序有差別,暫時因爲學業的緣由,沒有進行完善,還請擔待,後期會繼續完善。
循環
1、
#!/bin/bashcount=0n_1() #步數的統計及盤子的移動都是經過第一個函數調用來完成, { let count++ echo "第${count}步:將${2}號圓盤從${1}移動到${3}"}n_2() { if [ $1 -eq 1 ];then #若是位置變量1等於1的話,判斷成立,進行調用第一個函數 n_1 $2 1 $4 else #不成立進行此步驟,此循環調用函數調用於判斷第一個盤子將移動到那個柱子上,循環過程下邊有說明。 n_2 $[$1-1] $2 $4 $3 #此函數調用,用於輔助上下函數調用進行輸出。 n_1 $2 $1 $4 #此步驟進行後續循環調用,上一個n_2負責把盤子從第一個柱子移走到第二個柱子上, #這個n_2負責把第二個柱子上的盤子移動到第三個柱子上。 #中間的n_1負責最終要的一部將最大的盤子從第一個柱子移動到最後一個柱子上。 n_2 $[$1-1] $3 $2 $4 fi } read -p "please input the number: " num n_2 $num X Y Z num=3 n_2 3 X Y Z n_2 2 X Z Y n_2 1 X Y Z n_1 X 1 Z 輸出:第1步:將1由X移到Z n_1 X 2 Y 輸出:第2步:將2由X移到Y n_2 1 Z X Y n_1 Z 1 Y 輸出:第3步:將1由Z移到Y n_1 X 3 Z 輸出:第4步:將3由X移到Z n_2 2 Y X Z n_2 1 Y Z X n_1 Y 1 X 輸出:第5步:將1由Y移動X n_1 Y 2 Z 輸出:第6步:將2由Y移到Z n_2 1 X Y Z n_1 X 1 Z 輸出:第7步:將1由X移到Z
2、下邊方式還有待完善,能出結果,可是步驟詳解沒有作,僅作參考 。
#!/bin/bash sun=0 funa() { let asd-- let sun++ echo "步數 : $sun 盤子 : $1 移動方向: $2 ----> $3 " } funb() { if [ $1 -eq 1 ];then #當 funa $1 $2 $4 # N A C else funb "$[$1-1]" $2 $4 $3 if [ $? -eq 0 ];then echo "==================================================================$asd ---fun1" fi #1 N-1(4) A C B ------> A(A) B(C) C(b) #3 B a c # N-2(3) A B C -------> A B C Ab Bc Ca # 2 a c b -------> A Bc Cb # 1 a c b ------ a b c funa $1 $2 $4 if [ $? -eq 0 ];then echo "-=================================================================$asd ----fun2" fi #1 N A C # N-1(4) A B # N-1(4) B C #N-2 (3) \ # b--a # c--b funb "$[$1-1]" $3 $2 $4 if [ $? -eq 0 ];then echo "===================================================================$asd ----fun3" fi #1 N-1 4 B A C ----> A(B) B(A) C(C ) #3 a c b #2 N-1 3 a B C ----> Ac Ba Cb # 2 B a C # 1 fi } read -p "shuru panshu : " asd funb $asd A B C