JS实现汉诺塔实现递归算法

问题

       如下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数

汉诺塔模型图

算法分析

在我们每次距离对称最近的状态,都是把最大的圆盘放到了最右边,剩下的圆盘放到了中间,然后把中间的再都放到右边。

这道理就跟把大象装冰箱一样啊 都是三步呢!

这时候千万不要去想怎么把n-1层都搬到B柱 也不要想怎么把N-1层都搬到C柱,如果继续想下去你就会进入死循环,这时候你只需要做一个思维转换。

当我们把n-1层都搬到了中间柱的时候,只需要把最大的那个盘,从A搬到C柱就好了,剩下的怎么办呢?C柱永远是目标柱,我们不需要去移动它。这时候我们大点力!把B柱子掰下来!扔到A前面!无视掉C柱上面的大圆盘,因为我们不会再去动它了!然后利用递归,继续把最左边的n-1层都弄到中间,最大的扔到C就好了!

所以,实现这个算法的三个步骤为:

  • 把n-1个盘子由A 移到 B;
  • 把第n个盘子由 A移到 C;
  • 把n-1个盘子由B 移到 C;

  • 把A上n-1个盘子通过借助辅助塔(C塔)移到了B上
  • 把最大的一个盘子由A移到C上去
  • 把B上n-1个盘子通过借助辅助塔(A塔)移到了C上

JS源代码

var index = 0;
function hanoi(num,A,B,C){
  index++;
  if(num==1){
    //柱子只底下只有一个盘子
    move(A,C)
  }else{
    //A的num-1个盘子通过C移动到B
    hanoi(num-1,A,C,B);
    //A的最底下的盘子移动到C
    move(A,C)
    //B的盘子通过A移动到C
    hanoi(num-1,B,A,C)
  }
}
function move(first,final){
  console.log('从',first,' 移动到 ',final);
}

hanoi(4,'第一根柱子','第二根柱子','第三根柱子');
console.log('一共移动了',index,'次');

控制台打印结果

打印结果

要是仍然觉得不放心的话,可以在4399的汉诺塔小游戏,自行移动盘子,验证算法的准确性。

参考文章

汉诺塔的图解递归算法
经典算法:汉诺塔

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值