c++汉诺塔递归(移动盘子)

c++汉诺塔递归(移动盘子)

题目是:有三个柱子A,B,C。A柱子上有N个盘子,大的在下,小的在上。 要求:把这N个盘子从A柱子移到C柱子,在移动过程中借助B柱子,每次只允许移动一个盘子,且在移动过程中都保持大盘在下,小盘在上。

其实原理很简单,无非就是把第N个(最大的)盘子保留在A柱,把N-1个盘子先拿到B柱子,再把第N个拿到C柱子,最后把中间(B柱子)的N-1个盘子拿到C柱子。

然而看到代码的我一脸懵逼,看来学了c++半个月的小白要开始经受算法的毒打了???但还是要硬着头皮解释啊(嘤嘤怪咆哮)。

。。。。。three hours later。。。。。。。

吃了块雪糕我们开始,需要定义两个函数:
1.move:虽然叫他move,但作用只是用来输出每一步移动的步骤。
2.hamoni:这边具体解释第16行和18行,假设共有三个盘子,n=3时,马上16行开始调用自身,n=2,此时以目标dest为过渡,把src柱的盘子拿到medium柱,代码里就是中间柱子和目标柱子一直交换来交换去直至n==1,move输出A–>C后,16行自我调用完毕,退回到n=2;
执行17行,move输出A–>B;
接着执行18行,此时n=2,以源src作为过渡,把medium柱上的盘子放到目标dest柱子,转到if,move输出C–>B,18行自我调用完毕,退回到n=2,此时else循环结束;
然鹅,整个程序没有结束,else结束以后,先是第一个递归倒退一下返回n=2,结束,然后是第二个递归倒退一下返回n=2,结束。划重点:一开始主函数main中调用的hanoi也需要一个返回值!!也就是疯狂倒退回最初的n=3,接着按照流程执行完的程序才算是真正结束!

// An highlighted block
#include<iostream>
#include<cmath>
using namespace std;
void move(char src, char dest)
{
  cout<<src<<"-->"<<dest<<'\n';
}

void hanoi(int n, char src, char medium, char dest)   //src:源柱子;medium:过渡柱子;dest:目标柱子;
 {
      if(n==1)             //如果只有一个盘子,就直接从A拿到C;
      move(src, dest);     //src直接放进dest,  src 是起始柱-A柱, dest 是目标柱-C柱
      else
      {
        hanoi(n-1, src, dest, medium);    //16行;
        move(src, dest);
        hanoi(n-1, medium, src, dest);    //18行;
      }
 }
 
int main()
 {   
     int m; 
     cin>>m;                               //自定义盘子个数;
     hanoi(m,'A','B','C');                 //调用函数,传实参;
     return 0;             
 }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值