Hanoi塔问题的理解

文章详细介绍了汉诺塔问题的解决策略,通过将大问题分解为小问题的递归方法来移动盘子。当有N个盘子时,通过两次递归调用和一次直接移动,将盘子从起始柱经工具柱最终移动到目标柱。程序实现中使用了递归函数Hanoi,通过改变柱子角色来逐步解决问题。
摘要由CSDN通过智能技术生成
  • 假设A上只有两个圆盘a1,a2(a1比a2小),则只需将a1移动到B,再将a2移动到C,最后将a1移动到C即可。

  • 如果A中有N个盘子,则将N-1个盘子看作整体,就能类比上面两个盘的情况。

于是解法为:将N-1个盘子通过移动到B

将A中剩下的一个盘子移动到C

最后将N-1个盘子移动到C

最后将B中的N-1个盘子移动到C的过程中,我们可以忽略已经移动到C的那一个最大的盘子。这样问题就变成了将B中的N-2个盘子移动到C。这个问题显然和初始问题(将A中的N个盘子移动到C)本质上没有区别。

我们把ABC的表达方式换成起始柱,工具柱,目标柱。

这样B中的N-2个盘子移动到C:此时初始柱变为B,工具柱变为B,目标柱变为C。

则解法可以写成:

  1. 将起始柱上的N-1个盘子通过目标柱移动到工具柱

  1. 将起始柱剩下的一个盘子直接移动到目标柱

  1. (忽略放好的最大的盘子)将起始柱的N-2个盘子通过目标柱移动到工具柱

  1. 将起始柱剩下的一个盘子直接移动到目标柱

  1. ......接着不断重复一样的过程

程序:

void Hanoi(int n,char A,char B,char C)
{
if(n==1) move(A,1,C);
else
{
 Hanoi(n-1,A,C,B);//C为工具柱
 move(A,n,C);
Hanoi(n-1,B,A,C);//A为工具柱
}
}

第八行代码:Hanoi(n-1,B,A,C); //A为工具柱

带入void Hanoi(int n ,char A,char B,char C)

执行过程为:Hanoi(n-2,B,C,A);//将n-2个盘子从B通过C移动到A

move(B,n,C); //多的那个盘子从B到C

Hanoi(n-2,A,B,C); //将n-2个盘子从A通过B移动到C------>又是一次递归调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值