相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘。
游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

一、汉诺塔问题c语言代码:

#include<stdio.h>
void f(int n,char a,char b,char c)
{if(n>0)//递归终止条件 {f(n-1,a,c,b);//a→b printf("第%d个盘子:%c->%c\n",n,a,c);//n→c f(n-1,b,a,c);//b→c }
}
int main()
{int n;printf("please input numbers:\n");while(scanf("%d",&n)!=EOF){f(n,65,66,67);//传值给函数 }return 0;
}

执行三次后的情况:

二、汉诺塔的通项公式
递推公式: H(k)=2H(k-1)+1。
通项公式(有n个圆盘,全部完成需要的次数):sum=2^n-1。

三、汉诺塔问题的时间复杂度
由其多项公式可知时间复杂度为O(2^n)。

四、可视化图解

有3个圆盘时:

有10个圆盘时

四、总结
汉诺塔永远只有三步!
1.将A上面的n-1个盘子移到B上,即An-1次
2.将第n个盘子移到C上,一次就好
3.将B上面的两个盘子,移到C上,即An-1次



试着单纯从外部去理解汉诺塔递归问题,进入递归内部容易晕。

汉诺塔(Hanoi)递归算法相关推荐

  1. 【头歌】汉诺塔(Hanoi)的递归算法

    任务描述 本关任务:汉诺塔(Hanoi)的递归算法. 相关知识 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏.该游戏是在一块铜板装置上,有三根杆(编号A.B.C),在A杆自下而上.由大到 ...

  2. 理解 Hanoi 汉诺塔非递归算法

    汉诺塔介绍: 汉诺塔(港台:河内塔)是根据一个传说形成的数学问题: 最早发明这个问题的人是法国数学家爱德华·卢卡斯. 传说越南河内某间寺院有三根银棒,上串 64 个金盘.寺院里的僧侣依照一个古老的预言 ...

  3. 汉诺塔(Hanoi)问题归纳总结

    一.汉诺塔问题及其递归算法 1.问题阐述 经典汉诺塔: 外文算法书对汉诺塔问题的描述: 2.算法步骤 三阶汉诺塔问题解题步骤 共需7步. 四阶汉诺塔问题解题步骤 共需15步 五阶汉诺塔问题解题步骤 可 ...

  4. c语言程序设计电子图书 汉诺塔,用C写的汉诺塔(hanoi)程序

    用C写的汉诺塔(hanoi)程序 分类:计算机等级 | 更新时间:2016-07-07| 来源:转载 #include void movedisc(unsigned n,char fromneedle ...

  5. 汉诺塔问题——递归算法

    一.问题描述 汉诺塔问题是一个经典的问题.汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘 ...

  6. 关于汉诺塔非递归算法的一点思考

    前段时间做编译课设时老师提到了汉诺塔的非递归不容易做出来,于是我趁着寒假有点时间就想试着搞一搞.下面我把我的一些草稿先列出来,以免以后忘记. 下面这个模型是适合于偶数个盘片的情况的.奇数的情况类似可得 ...

  7. 汉诺塔问题递归算法python代码_[python]汉诺塔问题递归实现

    一.问题描述及算法步骤 汉诺塔问题的大意是有三根柱子a, b, c,现在a柱有N个盘子从下往上尺寸递减排列,要求: 1. 将a上的盘子移动到c柱上; 2. 每次移动一个盘子; 3. 柱子上的盘子始终必 ...

  8. 彻底解决汉诺塔问题——递归算法

    关于递归: 一定不要试图跟踪大型递归的过程! 要写出递归,关键就是找出递归的递归方程式: 也就是说,要完成最后一步,那么最后一步的前一步要做什么. 1)在求f(n, other variables)的 ...

  9. 汉诺塔(递归算法)C语言

    河内之塔 说明 河内之塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的, 河内为越 战时北越的首都, 即现在的胡志明市: 1883年法国数学家 Ed ...

最新文章

  1. Linux 内核源代码分析 chap 2 存储管理 (5)
  2. Cobbler部署指南之Cobbler安装操作系统篇
  3. (转)flex中使用swc实现更好的界面代码分离
  4. 被忽略的知识点——switch语句
  5. JSP的session处理
  6. elementUI组件el-dropdown - 踩坑篇
  7. JavaWeb——mybatis一对一、一对多查询
  8. LuaForUnity6:Lua模块
  9. Java CSV操作(导出和导入)
  10. 匿名页反向映射得建立
  11. python少儿图形编程软件_现在最好的少儿编程软件是什么?
  12. iOS 10.1发现新漏洞:可绕过“激活锁”强行进入主屏
  13. php网站开题报告该怎么答辩,如何应对开题报告答辩?看完你就明白了
  14. Unity获取真实地理地图应用Terrain笔记
  15. 死亡测试 - GoogleTest(五)
  16. Ceres-Solver安装与简介
  17. 现代循环神经网络 - 机器翻译与数据集
  18. 把数字金额转换成中文大写数字
  19. vs好用吗?vs2022下载。
  20. linux修改英文设置密码,linux 如何修改passwd的密码 设置密码

热门文章

  1. Log4j2漏洞修复
  2. 购买二手iPhone的利弊,以及需要注意的问题
  3. 将uniapp打包成h5放在安卓webview中(解决uniapp引入第三方地图卡顿问题)
  4. async、await详解
  5. javascript之异步操作理解---回调函数,async,await以及promise对象
  6. 2017noip提高组初赛试卷
  7. 完全二叉树的层序遍历(马老师的比赛心得)
  8. 计算机老师英语单词,关于英语单词computer的句子
  9. springboot之监听器
  10. 一道ctf流量分析题