c语言 汉诺塔问题 (递归问题)

汉诺塔问题:又称 河内塔 ,是一个源于 印度 古老传说的 益智玩具 。 大梵天 创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。说每次只能移动一个圆盘,而且要保证圆盘每次移动时,大圆盘都在小圆盘下面.(假设3根柱子分别为a,b,c)

问题分析:

根据问题的要求,不管我们有几个盘子,我们首先要做的就是把最大的盘子(也就是最下面的盘子)从a移动到c,这里我们拿两个盘子来举例说明(我们把可以移动的柱子称为安全柱)

 此时b c都是安全柱,所以我们通过c柱将小盘子放到b柱,然后再将大盘子放在c柱,最后将b柱上的小盘子移动到c柱。

 那如果有三个盘子呢:

 我们也可以将这种的看成两个盘子的类别,我们最初的目的肯定是想让A底下最大的盘子移动到C上。所以我们要将上面的两个盘子移动到B上,(这里就可以借鉴到上面移动两个盘子的情况)。我们假设现在就是要把盘子都移动到B柱上,这不就满足现在的条件吗(移动方式就是上面移动两个盘子的方式,只是现在要将两个盘子通过C移动到b,而上面是通过b移动到c)

可以看到刚开始的三步和上面移动两个盘子完全相同,(只是目的地C变成了b)

那如果我需要移动四个盘子呢,也是这样先把上面的三个盘子移动到B然后将最大的盘子移动到C,而移动三个盘子的方式,上面已经有方法了。(以此类推下面的n个盘子移动也相同。)

移动n个盘子,我们也是先将n-1个盘子通过C移动到·B,然后把第n个盘子移动到C,再把剩下的n-1个盘子通过A移动到C。

最后附上整个代码的截图:

黄色涂鸦的部分就是整个代码的核心。 

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值