C语言汉诺塔详解

问题概述:A柱子上从下往上按照大小顺序摞着N片黄金圆盘。要求把圆盘从下面开始按大小顺序重新摆放在另一根(B or C)柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

如图所示:

(ps:我们以从A移动到C来分析)

思路:如果只有一个盘子,那么就是直接把该盘子从A柱子移动到C柱子

如果有两个盘子,那么先把上面的1号盘子从A柱子移动到B柱子,然后将最下面的2号盘子从A柱子移动到C柱子,然后将1号盘子从B柱子移动到C柱子

如果有三个盘子,那么我们想到的肯定是,想要把最大的3号盘子上面的1号和2号盘子移动到B柱子上,然后再把3号盘子从A柱子移动到C柱子上,然后再把1号和2号盘子从B柱子移动到C柱子上。但是,一次只能移动一个盘子,所以,就可以把1号和2号盘子的移动拆解成有两个盘子的情况。

通过三次演示,其实不难发现,对应汉诺塔的问题,我们可以把它拆分成这样的规律

假设有N个盘子,

步骤1:我从A柱子借助C柱子,把前N-1个盘子移动到B柱子上,

步骤2:然后把第N个盘子,从A柱子移动到C柱子上,

步骤3:然后再把前N-1个盘子从B柱子借助A柱子移动到C柱子上。

步骤1又可以拆解成,是如何把N-1个盘子从A柱子移动到B柱子上的,那么就可以把这N-1个盘子,看成同样的一个问题去解决。即

步骤4:把前N-2个盘子从A柱子借助B柱子移动到C柱子上,

步骤5:然后再把第N-1个盘子从A柱子移动到B柱子上,

步骤6:然后再把前N-2个盘子从C柱子移动到B柱子上

步骤4又可以拆解成,是如何把N-2个盘子从A柱子移动到C柱子上的,那么就可以把这N-2个盘子,看成同样的一个问题去解决。即

步骤7:把前N-3个盘子从A柱子借助C柱子移动到B柱子上,

步骤8:然后再把第N-2个盘子从A柱子移动到C柱子上,

步骤9:然后再把前N-3个盘子从B柱子移动到C柱子上

以此类推,层层递进,一直到倒推完成上述步骤,同样的,步骤3也是通过该道理完成的,倒着推回去,就了解了。

递归算法

解法思路:(假设disc_n 等于4

步骤1if条件表达式不成立,使用hanno(3, ‘A’, ‘C’, ‘B’);用来表示步骤1,即将前3个盘子从A柱子借助C柱子移动到B柱子

步骤2而当以该参数再次传递给hanno函数的时候,这个时候,disc_n = 3 pillar_A = ‘A’ pillar_B = ‘C’, pillar_C = ‘B’ 因为不满足if条件表达式,继续将新disc_n的值(值为2)作为参数传递,而此时,因为pillar_B = ‘C’, pillar_C = ‘B’ 所以互换之后,第二次hanno(2, ‘A’, ‘B’, ‘C’);就是从A柱子将前2个盘子借助B柱子移动到C柱子,等价于步骤4,以此类推

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值