您好,欢迎来到飒榕旅游知识分享网。
搜索
您的当前位置:首页c++汉诺塔递归(移动盘子)

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;             
 }

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- sarr.cn 版权所有 赣ICP备2024042794号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务