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

来源: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. python五子棋单机版源代码_python实现单机五子棋
  2. Easy Tech:什么是MPEG-DASH协议
  3. eclipse各个版本的区别
  4. vuetify文件上传 file inputs
  5. 《集体智慧编程》学习笔记001
  6. 基于java的房屋销售管理系统设计(含源文件)
  7. 比特率和波特率的公式解析
  8. 【机器学习】监督学习的分类:判别/生成模型,概率/非概率模型、参数/非参数模型
  9. 如何把多个文件夹里的文件提取出来?
  10. 【大咖说】激活数据价值,永洪科技智胜法则
  11. 大陆资金港股打新股亲身体验全流程
  12. 第一课 初识计算机ppt,第一课 初识Powerpoint.ppt
  13. Anaconda——最省心的 Python 版本
  14. JAVA音视频解决方案----音频处理方案
  15. vue 脚手架 elementUi element-ui 兼容 ie 360 急速/兼容模式 完美处理
  16. 软件开发项目管理工具哪个好?
  17. 汉语韵律短语切分方法初探
  18. Robust官方文档介绍
  19. 第六章:TestOps的先决条件与TiP的类型
  20. 华北科技学院计算机期末考试,华北科技学院计算机等级考试报名

热门文章

  1. (Java程序)Excel自动生成mysql表
  2. 剑指OFFER----63-1、股票的最大利润I(js实现)
  3. 用java做一个简单的万年历
  4. 念数字(PTA题库)
  5. C++模拟鼠标点击和键盘输入的操作 mouse_event keybd_event
  6. 计算机网络——奈式准则和香农定理
  7. python 最小值算法_机器学习:Python实现最小均方算法(lms)
  8. java轮番_java多线程轮流打印数字字母案例代码
  9. 单因素设计一元定量资料差异性分析(一)-- 单组设计一元定量资料 t检验 与 符号秩和检验、配对设计一元定量资料 t检验 与 符号秩和检验
  10. Kai Zhang论文FFDNet 中代码Dataset理解