汉诺塔(Hanoi)是必须用递归方法才能解决的经典问题。借助c杆将所有的圆盘移到b杆上,每次只能移一个,且小的盘子一定在大的盘子上面

它来自于印度神话。上帝创造世界时作了三根金刚石柱子,在第一根柱子上从下往上按大小顺序摞着64片黄金圆盘,如图所示。上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放到第二根柱子上,并且规定,每次只能移动一个圆盘,在小圆盘上不能放大圆盘。有人预言说,这件事完成时宇宙会在一瞬间闪电式毁灭,也有人相信婆罗门至今仍在一刻不停地搬动着圆盘。


思考关键词:(结合代码看文字理解更快)

  1. 目标柱
  2. 转移柱
  3. 盘子的序号:从上往下 1 —> n!!
  4. 负担
  5. 柱子的序号:从左往右 A —> B —> C

( 6. 整体的思考,隐形的思考——)

思路详叙:【结合代码看思路更快】

【注意】画图可能会有多种移动方式,但是记住递归函数的本质,是有一定规律的,可以套用自己的,注意选择并找到正确的画图方式
//
//

  • 初拿到这道题的时候,因为要求使用递归,所以自然而然的想到去找规律,于是画了很多图,从1个开始画到了三个,步骤就有些多了,然后开始找规律
  • 当只有一个盘子的时候,只需要将其移动到中间的目标柱子上。当两个盘子的时候,就需要借助转移柱来把第二个盘子移到目标柱,如第二行图。
  • 当三个盘子的时候,为了把三号盘子转移到目标柱上面,必须把上面的负担先转移,也就是把一号盘子与二号盘子先转移到转移柱上,这样三号盘子才可以动。而关键的一点就是,此时假想三号盘子不在,只有一二号盘子,那么上一句话提到的转移柱(一号盘子和二号盘子)对他们来说就是目标柱,在回想两个盘子的移动过程,就会发现:当有三个盘子的时候,假设三号盘子隐形,就会出现两个盘子要移动到一个目标柱上面的情形。
  • 此时在回忆对于递归函数的理解:自己调用自己,用自己的一部分来表示自己(形象理解:字典就是一个递归,字典有汉字组成,用来解释别的成语也是有汉字组成)
  • 我们在上面发现了一点规律之后,就可以推广,联想两个盘子的时候,当有 n个盘子的时候,我们也会想把最下面的盘子先移动到目标柱子上。此时完全可以类推,上面的 n-1 个盘子为一个整体,先把这部分放到转移柱上,然后才可以把 n 号盘子转移到目标柱上。
  • 而把 n-1 个盘子转移到转移柱上,联想三个盘子的情形,需要借助另一个‘转移柱’才可以转移成功。此时就是转移柱和目标柱的转换
  • n-1 ,n-2 一直这样往回想下去,就会想到剩三个盘子的情形,就是递归函数的递归实现了

简而言之

只有三个柱子,只有一个转移柱,和一个目标柱,再多的盘子,都是在转移柱的帮助下实现的转移,其实就只有三步-(联想一下两个盘子的情形)-,上面的盘子到转移柱上去,底下的盘子到目标柱上去,上面的盘子再回来,这其实都是对称的过程,在转换过程中,每一个盘的目标柱和转移柱有转换的关系。可以用隐形盘子的想法,简单想把上面的盘子移到一个柱子之后在出现一个盘子,这时候的这个盘子就可以直接移到剩下的一根光秃秃的柱子上。(也可以想整体的思路,永远把上面的 n-1个盘子当成整体,往里套,最后在只有一个盘子的时候结束)

代码在此

要写递归函数强调一下递归函数的作用一定要明确
递归函数的出口要明确
递归的规律一定要写清楚

#include <stdio.h>
int i = 1;
void hannuo(int n,char a,char b,char c)//作用:打印把第n块移到目标的过程
{          //            目标柱  转移柱【针对编号为n的盘子】if (n == 1) {printf("%d[%d]: %c --> %c\n",i++,n,a,c);//第一次的时候,因为不断在调用,所以这里就是出口}else{hannuo(n-1, a,    c,     b);//                     目标柱【针对编号为n-1的盘子】为给n号盘子让路printf("%d[%d]: %c --> %c\n",i++,n,a,c);//就是该函数的目的:打印第n块被移到目标柱上hannuo(n-1, b, a, c);//依然从n-1号盘子开始往里调用,直到最后一个一号盘子归位结束递归函数}
}
int main ( )
{static int n;//静态全局变量的说明,当然可以不用,用全局变量写在外面就好。scanf("%d",&n);hannuo(n,'A','C','B');
}

运行结果

简洁版代码

#include <stdio.h>
int i = 1;
int n;
void hannuo(int n,char a,char b,char c)
{   if (n == 1) {printf("%d[%d]: %c --> %c\n",i++,n,a,c);}else{hannuo(n-1, a,    c,     b);printf("%d[%d]: %c --> %c\n",i++,n,a,c);hannuo(n-1, b, a, c);}
}
int main ( )
{scanf("%d",&n);hannuo(n,'A','C','B');}

**总结:**多练习递归,理解递归函数,在熟练运用,明白递归函数的三要素。

心得感悟(心里想逼逼的话

汉诺塔c语言做法:汉诺塔(Hanoi)是必须用递归方法才能解决的经典问题。它来自于印度神话。上帝创造世界时作了三根金刚石柱子,在第一根柱子上从下往上按大小顺序摞着64片黄金圆盘相关推荐

  1. 汉诺塔(Hanoi)是必须用递归方法才能解决的经典问题。它来自于印度神话。上帝创造世界时作了三根金刚石柱子,在第一根柱子上从下往上按大小顺序摞着64片黄金圆盘,如图7-3所示。

    汉诺塔(Hanoi)是必须用递归方法才能解决的经典问题.它来自于印度神话.上帝创造世界时作了三根金刚石柱子,在第一根柱子上从下往上按大小顺序摞着64片黄金圆盘,如图7-3所示.上帝命令婆罗门把圆盘从下 ...

  2. 汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺

    import java.awt.*; import java.awt.event.*; public class hanota extends Frame implements ActionListe ...

  3. 汉诺塔递归调用(C语言实现)有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘

    什么是汉诺塔呢:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按 ...

  4. 何谓财务“二上二下”“三上三下”部门预算机制

    何谓"二上二下"部门预算机制? 这原本是机关为了规范执法部门"收支两条线"管理,节约开支,建始县结合实际,对部门预算采用了"二上二下"的编制 ...

  5. [上一个][下一个][上一节][下一节]

    点击,切换二级知识点: 1-: 可以点击 [上一节][下一节] 切换 二级知识点, 同时 右边的 目录也会相应的展开 和关闭. 2-: 也可以直接点击 右边的 目录 进行知识点的切换. ------- ...

  6. C语言--实现汉诺塔【图文讲解,附代码】

    目录 (1)什么是汉诺塔 (2)汉诺塔打印步骤 (3)如何用C语言实现汉诺塔 (4)实现代码 (1)什么是汉诺塔   汉诺塔(Tower of Hanoi),又称河内塔.源自印度古老传说的一个游戏,大 ...

  7. 【C语言】汉诺塔问题(图文详解)

    汉诺塔 1. 什么是汉诺塔 2. 有关汉诺塔的有趣故事 3. 利用动画来演示汉诺塔 4. 如何用C语言实现汉诺塔 1. 什么是汉诺塔 源于印度古老传说的益智玩具 汉诺塔(Tower of Hanoi) ...

  8. C语言递归算法——汉诺塔问题(河内塔)

    汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘 ...

  9. 【C语言】汉诺塔问题。

    汉诺塔(Hanoi)是必须用递归方法才能解决的经典问题.它来自于印度神话.上帝创造世界时作了三根金刚石柱子,在第一根柱子上从下往上按大小顺序摞着64片黄金圆盘,如图7-3所示.上帝命令婆罗门把圆盘从下 ...

最新文章

  1. Java源码详解四:String源码分析--openjdk java 11源码
  2. 再读《精通css》03:引入和注释
  3. 【深度学习】Squeeze-and-Excitation (SE) 模块优势解读
  4. C#枚举硬件设备(升级版)
  5. buu 传统知识+古典密码
  6. linux常用命令_Linux常用命令全称
  7. 前端学习(2425):复习
  8. pg高性能服务器,Pgpool-II 负载均衡对PG的性能影响
  9. 全文检索工具包Lucene
  10. keil4如何将c语言转换成汇编语言_Keil 中关于C语言编译生成汇编代码函数名规则...
  11. 在Simulink中调整增益映射 Tune Gain Schedules in Simulink
  12. SAP License:税额保留小数位差异处理
  13. 别墅3D户型图制作|业务承接|原创教程(二)
  14. 【读书笔记】《暗时间》
  15. 小高考三门计算机能报大专吗,江苏小高考没过能上大学吗
  16. CSV是什么文件格式【转】
  17. 云服务器,liunx服务器上的图片通过浏览器访问
  18. Echarts制作横向坐标轴,并且文字名称和数值都在横向坐标轴的上面
  19. delphi控件切图界面闪烁_「这个控件叫什么」系列之加载占位图+页面指示器
  20. HttpClient详细使用示例

热门文章

  1. 人们从诗人的字句里选取自己心爱的意义但诗句的最终意义是指向你
  2. Tableau 读书笔记
  3. Python!Python!
  4. Latex 伪代码、三线表与多线表
  5. Android 音视频开发相关知识
  6. 对于iPhone描述文件的签名认证
  7. 门诊地图导航怎么做,零成本的医院室内导航解决方案
  8. 安卓手机如何投影到电脑?手机屏幕投影到电脑
  9. PHP画好看的图,HTML5画一个简单呢好看的电路图
  10. 威尔士和英格兰同属英国,但为啥还要在世界杯上进行PK?