c语言int move,c语言递归问题:汉诺塔问题:move(intn,intx,int 爱问知识人

假设最初有3个盘子,目标是柱子A移到柱子C上,柱子从左到右是A,B,C,我给你说明一下过程:

1。move(2,a,b);move(1,a,c);move(2,b,c);//将2个盘子从A移到B上,再将剩下的1个从A移到C上,最后将2个盘子从B移到C上,就完成了最终的任务。

但是,move(2,a,b)和move(2,b,c)这个操作要继续分解。

2。move(2,a,b) move(1,a,c);move(1,a,b);move(1,c,b)

3。move(2,b,c) move(1,b,a,);move(1,b,c);move(1,a,c);

4。

最后,合成所有的动作就是:move(1,a,c);move(1,a,b);move(1,c,b);(前三步在完成move(2,a,b)的动作)move(1,a,c);move(1,b,a,);move(1,b,c);move(1,a,c);(后三步在完成move(2,b,c) 的动作)

现在,你拿三本书来验证一下上面的对不对,再体会一下。

思考方式就是递归的方式。

一个元操作move(n,x,y,z)是指,把n本书从柱子x移到柱子z,移的过程中要借用柱子y。我的move里面省略了y,是为了表达更清晰。当n>1时,意味着我们要先把上面的n-1个移走(这一操作要继续分解为更小的操作),再最下面的那个最大的移到目标位置,最后再把上面的n-1也移到目标位置(这一操作也要继续分解为更小的操作)。

当n=1时,意味着我们可以直接把这1个盘子移到目标位置,此时也就退出了递归。

这里有个细节要体会一下,为什么要先移上面的n-1个,再最后移下面一个大的,因为汉诺塔问题规定,任何时候都必须是大的在下面,小的在上面,对于上面的n-1个,最下在的大盘子就像平地一样,其所在的柱子可以随意使用。

反过来,先移上面1个,再移下面的n-1个就是不可行的,因为会有一个柱子变得不可用。

你跟踪下程序,会让你更清晰,注意参数的变化。也可以拿纸画一下。

注意,我们实际演示中的一个移动的动作,程序中就是用printf()这样一句话来表示的。

OKAY?。

全部

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值