汉诺塔问题精讲(c++关于递归)

首先我们在我们脑海中或纸上先画三个盘子

 如图所示如果我们要将其重a移动到b其中c为替代盘我们可以分如图三步将盘子移动好。之后在a上加一个盘子

 如图我们先要考虑什么呢,是不是先考虑将上面两个盘子先移动到c上然后再将最底下的盘子移动到b上,而最上面现在有两个盘子这个时候的移动方法是不是可以参考上面两个盘子的移动方法,但盘子移动的目标位置却不一样。之后我们依次类推发现我们对于移动盘子我们只需要三步先将n-1个盘子都移到替代盘,然后再将最后一个盘子移动到b盘然后再将c上的盘子移动到b上,首先第一步我们是将a盘当作移动盘c当作目标盘,b当作替代盘,第二步只有一步就是移动一个盘子将a上的最后一个盘子给b盘,最后一步就是将c做为移动盘,b作为目标盘,a作为替代盘。这道题的关键在于就是使用递归来解决这个问题,大家将递归想象成下楼,这样就好理解了,从n层楼开始下直到下到第一层,问题解决,而这道题相当于我们有两个通道,每层楼我们都有两个人下楼,下楼方式都是一样的,但下楼的函数需要换一下,最终都是要下到第一楼,我们的函数结束。递归结束,下面附上我们的简单代码。

#include<bits/stdc++.h>
using namespace std;
void move(int a,char b,char c,char d)
{
    if(a==1)
        cout<<1<<": "<<b<<" -> "<<c<<endl;
    else 
    {
            move(a-1,b,d,c);
            cout<<a<<": "<<b<<" -> "<<c<<endl;
            move(a-1,d,c,b);
    }
}
int main()
{
    int a;
    char b,c,d;cin>>a>>b>>c>>d;
    move(a,b,c,d);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

B程洪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值