文章目录

  • 前言
  • 汉诺塔移动图解
  • 汉诺塔移动次数
  • 汉诺塔的打印
  • 结语

前言

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

而婆罗门移动圆盘需要用多长时间呢?通过平常的方法是很难计算的。

今天我们就利用递归的思想来计算一下汉诺塔的移动次数和汉诺塔的移动步骤!

汉诺塔移动图解

汉诺塔移动的规律为一次只能移动一个圆盘,并且小盘要在大盘的上方,假设在A柱有n个圆盘,我们先要把n-1个圆盘从A柱移动到B柱,再把第n个圆盘移动到C柱,最后把n-1个圆盘移动到C柱。

以三阶汉诺塔为例:

汉诺塔移动次数

利用穷举的办法,对于汉诺塔的移动次数进行计算:

阶数 次数 规律
1 1 2^1-1
2 3 2^2-1
3 7 2^3-1
4 15 2^4-1
2^n-1

对于n阶汉诺塔的移动次数:

  • 步骤1所含步数就是n-1个圆盘移动所需的次数,我们可以将其步数看做f(n-1)。
  • 步骤2所含步数为1。
  • 步骤3所含步数与步骤1相似,我们也将其步数看做f(n-1)。

再观察表格中汉诺塔的移动次数,对于一阶汉诺塔移动次数就为1,对于其他的阶数则为前一阶汉诺塔移动次数 + 1 + 前一阶汉诺塔移动次数。

不难得出递推表达式:f(n-1) + 1 + f(n-1) = 2 * f(n - 1) + 1

移动步骤符合递归思想,代码展示:

#include<stdio.h>
int hanoi_step(int n)
{if(n<=1)return 1;elsereturn 2*hanoi_step(n-1)+1;
}
int main()
{int n = 0;scanf("%d",&n);int ret = hanoi_step(n);printf("%d\n",ret);return 0;
}

运行结果:

汉诺塔的打印

这里的打印指的是打印汉诺塔移动的步骤。

我们可以先尝试写出1-4阶汉诺塔的移动步骤:

阶数 步骤
1 A->C
2 A->B,A->C,B->C
3 A->C,A->B,C->B,A->C,B->A,B->C,A->C
4 A->B,A->C,B->C,A->B,C->A,C->B,A->B,A->C,B->C,B->A,C->A,B->C,A->B,A->C,B->C

我们观察移动步骤,发现只有一个圆盘时移动步骤为A->C;两个圆盘时,为A->B,A->C,B->C。

那么对于n阶汉诺塔呢,我们对其进行推演:

  • 把n-1个圆盘从A移动到B
  • 把第n个圆盘从A移动到C
  • 把n-1个圆盘从B移动到C

那n-1个圆盘如何从A移动到B呢?

  • 把n-2个圆盘从A移动到C
  • 把第n-1个圆盘从A移动到B
  • 把n-2个圆盘从C移动到B

同样的,对于把n-1个圆盘从B移动到C,也可以推测出来:

  • 把n-2个圆盘从B移动到A
  • 把第n-1个圆盘从B移动到C
  • 把n-2个圆盘从A移动到C

通过这些推演我们发现,汉诺塔的移动可以通过递归展开,那么以上推演步骤,我们可以将其作为递归的步骤。

思路:定义A,B,C三个字符,表示A,B,C三柱,定义n为阶数,那么n-1也就是移动步骤中,需要移动的圆盘数。
对于一阶汉诺塔,直接移动即可,对于其他的阶数,则需要通过递归展开,为n阶汉诺塔的移动步骤。

#include<stdio.h>
void hanoi_move(int n,char A,char B,char C)
{if(1==n){printf("%c->%c\n",A,C);}else{hanoi_move(n-1,A,C,B);//将n-1个圆盘从A移动到Bprintf("%c->%c\n",A,C);//将第n个圆盘从A柱移动到C柱hanoi_move(n-1,B,A,C);//将n-1个圆盘从B柱移动到C柱}
}
int main()
{int n = 0;scanf("%d",&n);hanoi_move(n,'A','B','C');return 0;
}

只通过代码可能不太直观,我们以三阶汉诺塔为样例,观察递归是如何展开的:

运行结果:

结语

了解了汉诺塔的移动步数和过程,我们也可以对64片黄金圆盘移动完需要的时间做一个估算,将每次移动看作一秒,那么时间为:2 ^ 64 - 1 = 18,446,744,073,709,551,615秒,换算成年数,约为5800亿年。

按照这个进度,到时候世界毁灭也是有可能的,只是可怜了“悲惨的婆罗门”需要移动这些圆盘(doge)。

以上就是C语言递归求解汉诺塔的全部内容,如果觉得anduin写的还不错的话,还请一键三连!

我是anduin,一名C语言初学者,我们下期见!

【C语言】递归详解汉诺塔问题相关推荐

  1. 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层个 ...

  2. C语言递归思想实现汉诺塔

    目录 1.递归思想简介 2.汉诺塔问题 3.汉诺塔递归的c语言实现 1.递归思想简介 在c语言中,程序调用自身的编程技巧称为递归( recursion). 递归的定义看上去似乎很抽象,使用代码描述能够 ...

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

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

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

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

  5. 图文详解汉诺塔(附C语言实现代码)

    关注.星标公众号,直达精彩内容 来源:http://a.nxw.so/1iDyQD 一.前言 汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具.大梵天创造世界的时候 ...

  6. C语言递归小游戏—汉诺塔(hanoi)

    前言: 汉诺塔大家都不陌生吧,在猩球崛起这个电影里,人们通过凯撒玩汉诺塔知道了它的智商增高了,这个益智小游戏的规则就是: 汉诺塔(Tower of Hanoi),又称河内塔.是一个源于印度古老传说的益 ...

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

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

  8. 递归巧解汉诺塔问题(hanoi)

    /* hanoi问题:在source处的盘子通过help处到达target source:一开始所处的位置 help:盘子可以借助的地方 target:到达的地方 n:盘子的个数 */ void ha ...

  9. C语言---移盘子----Hanoi(汉诺)塔问题,显示移动盘子的步骤

    C语言-移盘子----Hanoi(汉诺)塔问题,显示移动盘子的步骤 在学习递归的过程中,Hanoi(汉诺)塔问题是避开不了的,很多新手在这儿一脸懵. 我们先简单介绍一些Hanoi(汉诺)塔问题到底是个 ...

  10. 深度理解递归,手撕经典递归问题(汉诺塔,青蛙跳台阶),保姆级教学。

    目录 序言: 一.函数递归( recursion) 二.递归的两个必要条件 三.递归小问题 (1)接受一个整型值(无符号),按照顺序打印它的每一位 (2)编写函数不允许创建临时变量,求字符串的长度(利 ...

最新文章

  1. 快速构建Spring Cloud工程
  2. 处理外部信息(xml,html,js,shareObject)
  3. 数字图像处理(作业四)——边缘表达
  4. 谷歌开源 Pigweed,用于提升嵌入式开发效率
  5. SQL Sever 数据完整性
  6. 《一分钟经理人》学习笔记第五部分---一分钟表扬为什么有效
  7. vue学习笔记-15-vue生命周期
  8. Robocode:下载安装及迁移至IntelliJ
  9. Tomcat之—— linux/centos 解决Tomcat内存溢出
  10. cmos逻辑门传输延迟时间_边沿触发器 || D触发器 || JK触发器 || 逻辑功能转换 工作特性 || 重难点 || 数电...
  11. Java 使用 throw 抛出异常
  12. iOS9适配http,微信、qq、支付宝添加白名单
  13. java对pdf文件进行加密操作
  14. 计算机之父冯·诺依曼
  15. kubernetes资源类型--secret和Service Account
  16. JavaScript学习笔记——JS基础0
  17. 精选!必备的VSCode插件
  18. 图片放大不失真?图片无损放大的方法
  19. 掘金量化是什么?有哪些特点?
  20. 用python计算成绩_Python使用splinter自动登录教务系统查询并计算成绩(CUMT新版教务系统)...

热门文章

  1. javafx 按钮中放置图片导致大小设置失效
  2. 餐饮后厨计算机应用,美萍餐饮管理系统,餐饮管理软件,餐饮软件,酒店收银系统,饭店点菜系统 --- 管理软件 美萍是专家!...
  3. php如何实现自动加载mp3,如何简单的实现php自动加载
  4. C语言学习:C语言编译流程
  5. 中国智能手机行业的江湖事
  6. VBA实战代码大全-下载
  7. OpenCV x64 vs2010 下打开摄像头录制视频写成avi(代码为转载)
  8. 华为OLT(MA5680T)查看光猫光衰
  9. spring源码 学习方法
  10. MySQL数据库备份