【SHELL】 3個漢諾塔的實現
阿新 • • 發佈:2019-02-08
3個漢諾塔的實現。漢諾塔的問題的具體描述就不再重複了。直接上程式碼。
1 #!/bin/bash 2 Time_Initial=`date "+s:%s"|awk -F":" '{printf($2)}'` 3 a=a #A柱,也可以理解為源柱。 4 b=b #B柱,也可以理解為快取柱。 5 c=c #C柱,也可以理解為目的柱。 6 hanoi() 7 { 8 if [ $1 = "1" ];then 9 echo "$2 -> $4" #最後一步(即當步數為1時),把最後一個盤子 從A柱挪到C柱 10 let num+=1 11 return 0 12 else 13 { 14 hanoi $[$1-1] $2 $4 $3 #中間狀態前的一步,需要將B柱空出來為下一 步做準備。因此要把A柱的n-1個盤子都挪到B柱中。 15 echo "$2 -> $4" #和最後狀態一樣的中間狀態,此時C柱是最大 的盤子,相當於於沒有盤子,要做的就是講A柱的盤子放到C柱中。當$1=1時,就是最後一步。 16 let num+=1 17 hanoi $[$1-1] $3 $2 $4 18 } 19 fi 20 } 21 read -p "please input the numbers of disk:" n; 22 hanoi $n $a $b $c 23 echo ${num} 24 Time_End=`date "+s:%s"|awk -F":" '{printf($2)}'` 24 Time_End=`date "+s:%s"|awk -F":" '{printf($2)}'` 25 printf "Cost of time is %3d"$(($Time_End-$Time_Initial))"\n" 26 exit 0 27 ## 為了方便大家理解,下面是分解到每一步的動作: 28 ## 源柱 快取柱 目的柱 29 ##初始 A B C 30 ##N-2次移動後…… 31 ##N-1 A C B 此布是N-1個盤以A為源柱,C為快取住,移動到B柱。完成後,N-1個> 盤都:移動到B柱,C柱空出,變為下一步的快取柱, 32 ## A -> C N-1步完成後,C柱空出(這裡不要單純的理解為編號為C的柱,而應該 理解為是快取柱),將A柱的N盤(最大盤)移動到C盤。即A->C,此時A柱空出,變成快取柱。當N=1時,最後一個> 盤移動到C柱,遊戲結束。 33 ##(N-)-1 B A C 上一步完成後,N盤根據規則可以認為已經消失了,N-1盤為最大,是上 一步的N盤,(N-1)-1就是上一步的N-1盤。此時就需要把剩下的(N-1)-1個盤,以B為源柱,以A柱為快取柱,向C 柱移動.這個就是一個遞迴的入口。 34 ## 因此,遞迴函式的實質為 移動(盤個數,源柱,快取柱,目的柱).