关注、星标公众号,直达精彩内容

来源:http://a.nxw.so/1iDyQD

一、前言

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

二、汉诺塔打印步数

1、不使用递归计算1个n层的汉诺塔从A柱到C柱的所有步数如下

实现代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
int main()
{int num = 0;scanf("%d", &num);//塔数printf("完成%d层的汉诺塔需要%d步\n", num, (int)pow(2,num) - 1);return 0;
}

2、使用递归计算1个n层的汉诺塔从A柱到C柱的所有步数

原理:

  • 将n-1个碟子从A杆经C杆移动到B杆

  • 将A杆上的第n个碟子移动到C杆

  • 将n-1个碟子从B杆经A杆移动到C杆

所以: f (n -1 ) + 1 + f (n - 1);  ->  2 * f (n - 1) +1; 这个式子叫做递推式

实现代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int Hanio_twice(int num)
{if(1 == num)return 1;elsereturn 2 * Hanio_twice(num - 1) + 1;
}
int main()
{int num = 0;  scanf("%d", &num);//塔数int ret = Hanio_twice(num);printf("完成%d层的汉诺塔需要%d步\n", num, ret);return 0;
}

梵天说假如把64个金片从A挪到C,那么这个世界就毁灭了(这里以上的代码都不能输出这个数字)
推理得:

2 ^ 64 - 1 -> 大约是1800亿亿步,这是个什么概念呢?
1年有365天,每天24小时,每小时是3600秒。如果1秒钟移动1次,如果把这64块金片全部移动完,大概需要5800亿年。宇宙形成到现在也就138亿年

三、汉诺塔打印步骤

使用递归打印1个n层的汉诺塔从A柱到C柱的所有步骤

原理:封装1个函数Hanio(num, ‘A’, ‘B’, ‘C’)。

其中num是塔数;A、B、C,3个字符为抽象成的3个柱子。

如果只有1层那么输出A;否则就有2种情况,其1是将n-1个碟子从A经C到B。其2是将n-1个碟子从B经A到C

实现代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void Hanio_Step(int n, char A, char B, char C)
{if (1 == n)printf("%c->%c\n", A, C);else{Hanio_Step(n-1, A, C, B);printf("%c->%c", A, C);Hanio_Step(n-1, B, A, C);}
}
int main()
{int n = 0;scanf("%d", &n);Hanio_Step(n, 'A', 'B', 'C');return 0;
}

步骤剖析图:
注:图片有点小大家可以放大点看
scanf -> 2

scanf -> 3    注:因为后面的步骤太多了,所以省略一部分

版权声明:本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。

‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧  END  ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧

关注我的微信公众号,回复“加群”按规则加入技术交流群。
点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。

图文详解汉诺塔(附C语言实现代码)相关推荐

  1. 多图详解汉诺塔递归实现思路--含实现代码

    前言 为了节约大家的时间,本文对汉诺塔的定义就不做赘述了,如果有小伙伴不清楚汉诺塔的规则可以直接点蓝字跳转过去. 本篇博客内容 汉诺塔实现的思路 用递归的方式实现汉诺塔 汉诺塔实现的思路 我们先以两个 ...

  2. python递归详解+汉诺塔小案例_汉诺塔,python递归实现解法步骤

    def hanoi(n,x,y,z):#函数实现n个盘子在x,y,z,移动 if n==1: print(x, ' --> ', z) else: hanoi(n-1,x,z,y)#将n-1层个 ...

  3. python汉诺塔递归算法流程图_详解汉诺塔Python递归程序

    学习递归时,很多小伙伴对汉诺塔的递归算法非常疑惑,不清楚那么复杂的移动过程,为何用四五行代码就给解决了.汉诺塔问题:有三根柱子A,B,C.A柱上有若干碟子,每次移动一块碟子,小的只能叠在大的上面,把所 ...

  4. 汉诺塔c语言执行步骤详解,详解汉诺塔执行过程

    问题补充: 能否从以下开始详细像上面那样说明一下程序的运行过程吗?本人主要不知道函数的运行过程. 返回B第一次调用 6,向下执行,执行完毕,返回A第一次调用 7,本次函数中p=a,q=b,r=c,m= ...

  5. c语言递归汉诺塔次数,c语言递归解决汉诺塔参数变化的疑惑

    c语言递归解决汉诺塔参数变化的疑惑 答案:3  信息版本:手机版 解决时间 2020-04-05 14:20 已解决 2020-04-05 10:49 #include void main() {vo ...

  6. hanoi塔(汉诺塔)--C语言

    hanoi塔(汉诺塔)–C语言 一.什么是hanoi塔 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具. 大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄 ...

  7. 个盘子的汉诺塔需要移动几步_看漫画学C++039:递归解汉诺塔

    点击蓝字 关注我们 本话内容 请输入 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏.该游戏是在一块铜板装置上,有三根杆(编号A.B.C),在A杆自下而上.由大到小按顺序放置64个金盘(如 ...

  8. 从“递归结构”到解汉诺塔问题的求解

    解决递归问题的关键在于寻找递归的结构. 寻找一个可递归问题的递归结构,不仅可以直观地转换为程序语言,进行问题的求解,而且也为我们人脑对问题的求解提供思路,比如3阶的汉诺塔,我们还可简单设计方案,倘若四 ...

  9. 一句话解决汉诺塔(C语言递归)每日一练

    看题目: 编写一个程序,对于一个有n个盘子的汉诺塔,列举将这n个盘子从柱子 A 移动到柱子 C 需要的所有移动步骤> 一句话时间: 规律是二的n次方减一,步骤思想是把除了最大的盘子的所有盘子借助 ...

最新文章

  1. 大数据架构+Lamba+Kappa+Unifield
  2. Linux下使用Google Authenticator配置SSH登录动态验证码
  3. Elastic Search 上市了,Slack上市了,我也要写个软件,走上人生巅峰
  4. 联想rd540服务器怎么装系统,联想RD540加显卡BIOS设置
  5. 阿里云MaxCompute(大数据)公开数据集---带你玩转人工智能 1
  6. 大数据之-Hadoop3.x_MapReduce_数据压缩_案例实现---大数据之hadoop3.x工作笔记0139
  7. Tricks (四十一)—— 一 list 两用
  8. [导入]Manning.Ajax.in.Action.Oct.2005.pdf(9.26 MB)
  9. Mysql客户端的安装
  10. 复习,网课,视频回放,太慢怎么办,试试倍速播放吧 (无需下载)
  11. hitool java_Hitool打开出现failed to create the java virtual machine
  12. 原生JS实现的跳一跳小游戏完整实例
  13. mac为什么不支持ntfs,mac读取ntfs移动硬盘软件有哪些
  14. php万年历月份处理_使用 PHP 写的万年历接口
  15. EINT、DINT、ERTM、DRTM和EALLOW、EDIS、ESTOP0解析
  16. Composing Programs 2.2 Data Abstraction
  17. matplotlib.pyplot 标记出曲线上最大点和最小点的位置
  18. 文件夹双击提示找不到应用程序,右键可以打开(已解决)
  19. Qt开发经验总结之武林秘籍(转)
  20. 软件工程导论第六版 第五章 总体设计知识点总结

热门文章

  1. 公布 中国移动飞信 部分 源码
  2. 花痴流口水颜文字_什么是流口水?
  3. 个人观点,说一下对 PHPCMS 的网站架构的看法
  4. MLP神经网络,GRNN神经网络,SVM神经网络以及深度学习神经网络对比识别人体健康非健康数据
  5. 赌博、游戏,和赌博游戏
  6. Docker安装pgAdmin4
  7. html文字自动大小写,CSS中首字母大写如何实现
  8. 干法读书心得:第一章 那些智慧迸发的瞬间 读后感
  9. 一个很很很简单的移动端日历
  10. 打印冻结窗格怎么保证每页都有_EXCEL固定表头_冻结窗口以及打印的应用方法