秒懂汉诺塔

news/2024/11/28 11:41:52/

递归经典题(汉诺塔)
什么是汉诺塔呢???
  汉诺塔(Tower of Hanoi),又称河内塔。源自印度古老传说的一个游戏,大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
       

一个盘子
只有一个盘子的时候,就比较简单了。如图,只需要一步,直接把 第 1 个盘子从 A移动到 C就完成了。

两个盘子
两个盘子的时候,也比较简单,如下图,只需要借助一下 B 柱子即可完成。

这个过程可以表述为:

把第1个盘子从A移到B
把第2个盘子从A移到C
把第1个盘子从B移到C
三个盘子
三个盘子的时候,稍微复杂一些,但是我们一般也是可以通过心算,把过程推演出来的。

把第1个盘子从A移到C
把第2个盘子从A移到B
把第1个盘子从C移到B
把第3个盘子从A移到C
把第1个盘子从B移到A
把第2个盘子从B移到C
把第1个盘子从A移到C
第n 个盘子:

int a = 0;
void Move(int n,char c,char d)
{
    printf("第%d步 ", ++a);//每调用一次Move就代表走了一步,所以++a
    printf("把%d号盘,从%c号柱移到%c号柱\n",n, c, d);
}
void Hanoi(int n,char x,char y,char z)
{
    if (n == 1)
    {
        Move(n,x,z);//当n=1,直接将盘子从x移到z上
    }
    if (n > 1)
    {
        Hanoi(n - 1,x,z,y);//上面的n-1个盘子,从x借助z(一个一个)移到y
        Move(n,x,z);//剩下的一个盘子从x移到z
        Hanoi(n - 1,y,x,z);//再将n-1个盘子从y借助x(一个一个)移到z
        //把大象放进冰箱三步法
    }
}
int main()
{
    int n = 0;
    printf("请输入圆盘的个数>");
    scanf("%d", &n);
    Hanoi(n,'X','Y','Z');
 
    return 0;
}

函数具体分析:
 一个盘子时,进入函数Hanoi,n=1,执行Move,带去的实参是1,x ,z,所以输出的是

把第一个盘子从x移到z.

两个盘子时,

进入函数Hanoi,n=2,2>1,再次进入函数Hanoi,传的参数是1(n-1)x,z,y,与形参相对应的是n,x,y,z,即在此函数中z用y代替,y用z代替,

第2次进入Hanoi函数后,n=1,执行Move函数,传的参数是1,x,z(y),(传的参数实际上还是第一次的,即y实际就是z,z实际就是y),所以第一次输出的是把第1号盘,从x移动到y.

当(n-1)=1的Hanoi函数执行完之后,又返回去接着执行n=2的Hanoi函数,

,接下来执行Move函数,传的参数是2,x,z.所以第2次输出的是把第2个盘子,从x移动到z.

接下来第3次进入函数Hanoi函数,传的参数是1(n-1),y,x,z,与形参相对应的是n,x,y,z,(即在此函数中x代替y,y代替x,z还是z)

执行函数时,n=1,执行Move函数,传的参数是1,x(y),z,所以输出的把第1个盘子从y移动z。


http://www.ppmy.cn/news/241561.html

相关文章

SpringBoot整合Mybatis-Plus多数据源

一、前言 随着业务的不断扩展和复杂度的增加,我们在开发过程中往往需要访问多个数据库。 比如: 我们可能需要同时访问主数据库和从数据库,或者访问多个独立的数据库来处理不同的业务逻辑。这时候,我们就需要使用多数据源来实现对…

通过Visual Studio诊断工具定位软件CPU瓶颈

通过VS诊断工具定位软件CPU瓶颈 前情提示:正常情况下我们使用调试模式会看不到诊断工具窗口,控制台会报“无法启动标准收集器。请尝试修复 Visual Studio 的安装。 (HRESULT: 0xe1110002)”这样的错误。 解决方式:通过[Downloads - Visual St…

联想yoga13s锐龙版和酷睿版 哪个好

联想yoga13s两个版本的屏幕都是一样的,都采用了13.3英寸的尺寸大小的屏幕,分辨率都是2.5k,色域为100%sRGB高色域,屏幕占比比较高,为全面屏设计,两个版本的屏幕素质不错,是目前轻薄本市场中第一梯…

联想拯救者y7学计算机可以用吗,2018什么笔记本电脑好 联想拯救者y7000评测

如今,爱好网游的年轻朋友非常多,尤其是热衷于端游的人较多。为了使自己在玩游戏时不出现卡顿的现象,越来越多的朋友都选择购买游戏本。于是,许多电脑品牌纷纷推出游戏本,当然联想也不例外。那么下面小编就来给大家具体…

联想拯救者r720适合java么_联想拯救者哪个型号好 联想拯救者r720怎么样【详解】...

目前,联想这一品牌旗下的笔记本或者电脑在我们生活中出现的频率很高,因为其产品质量一直以来都让广大消费者十分放心。针对一些游戏爱好者,联想推出了一系列的游戏本,拯救者就是其中比较热门的系列。但是,究竟 联想拯救…

学计算机r7000和y7000哪个好,分析看看联想拯救者r7000和y7000区别是什么?哪个好?真相评测揭秘...

这两款联想拯救者r7000和y7000区别不是很大的哈,款式和配置是差不多的,只是说联想拯救者y7000p大气一些的,看个人喜欢吧,我自己用的是联想拯救者y7000p,这款性价比蛮高的,质感蛮强的,电脑贼棒.外…

学计算机r7000和y7000哪个好,联想拯救者r7000p和y7000p哪个好-联想拯救者r7000p和y7000p评测对比...

联想拯救者r7000p 2020最近开放上架了,那么这款搭载了AMD处理器的游戏本对标y7000p又有哪些不同之处呢,两款笔记本是否体验不同,究竟哪一款更好,哪一款更香,哪一款更实在,快来了解一下吧,也许能…

当开发同事辞职,接手到垃圾代码怎么办?

目录 一、前言 二、开发中的另一种选择 三、低代码概念 四、低代码在开发中的优势 01、开发效率提高 02、开发成本减少 03、维护性更高 五、有低代码后就不要开发了? 一、前言 事实上,垃圾项目是日积月累而成的,所谓冰冻三尺非一日之寒&#xf…