【SHELL】 3个汉诺塔的实现

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 ##      因此,递归函数的实质为 移动(盘个数,源柱,缓存柱,目的柱).

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值