C语言 Hanoi(汉诺)塔问题,用递归解决

2023-05-16

【问题】
古代有一个梵塔,塔内有3个座A,B,C。开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把64个盘子从A作移到C座,但规定每次只能移动一个盘,且在移动过程中在3个座上都始终保持大盘在下小盘在上。在移到过程中可以利用B座。要求编写程序输出移动盘子的步骤。
【思路】
请添加图片描述
如图所示,先将A座上面的63个盘子借助C座移动到B座,然后把A座上第64 个盘子移动到C座,最后把B座上的63个盘子借助A座移动到C座。
为便于理解,先分析A座有3个盘子的情况,移到前的情况如下图:
请添加图片描述

(1)将A座上2个盘子借助C座移动到B座请添加图片描述
(2)将A座上1个盘子移动到C座
请添加图片描述
(3)将B座上的盘子借助A座移动到C座。
请添加图片描述
其中第(2)步可以直接实现。
第(1)步又可用递归方法分解为:
①将A座1个盘子从A座移到C座
②将A座1个盘子从A座移到B座
③将C座1个盘子从C座移到B座
第(3)步可分解为:
①将B座1个盘子从B座移到A座
②将B座1个盘子从B座移到C座
③将A座1个盘子从A座移到C座
将上述综合起来,移到3个盘子的步骤为:
A->C,A->B,C->B,A->C,B->A,B->C,A->C
共经历了7步。
由此可以推出:移动n个盘子要经历(2^n-1)步。
所以,将n个盘子从A座移到C座可以分解为以下3个步骤:
(1)将A座的(n-1)个盘子借助C座移到B座
(2)将A座剩下的一个盘子移动到C座
(3)将B座的(n-1)个盘子借助A座移到C座
上面的第(1)步和第(3)步,都是把n-1个盘子从一个座移到另一个座,采取的办法是一样的,只是座的名字不同而已。所以将第(1)步和第(3)步表示为:
将one座上n-1个盘子借助three座移到two座。
只是在第(1)步和第(3)步中,one,two,three和A,B,C的对应关系不同。
对于第(1)步:
对应关系是one对应A,two对应B,three对应C。
对于第(3)步:
对应关系是one对应B,two对应C,three对应A。
因此,可以把上面的3个步骤分解成两类操作:
(1)将(n-1)盘从一个座移到另一个座,这是一个递归过程。
(2)将一个盘子从一个座移到另一个座。
【编写程序】
分别用两个函数实现以上两类操作。
用Hanoi函数实现(1)
用Move函数实现(2)
函数调用Hanoi(n,one,two,three)表示将n个盘子从one座借助two座移到three座的过程
函数调用Move(x,y)表示将1个盘子从x座移到y座的过程
【代码实现】

void Move(char x, char y)
{
	printf("%c->%c\n", x, y);
}
void Hanoi(int n, char one, char two, char three)
{
	if (n == 1)
		Move(one, three);
	else
	{
		Hanoi(n - 1, one, three, two);
		Move(one, three);
		Hanoi(n - 1, two, one, three);
	}

}
int main()
{
	int number;
	printf("请输入要移到的盘子的数量:\n");
	scanf("%d", &number);
	printf("移动盘子的步骤为:\n");
	Hanoi(number, 'A', 'B', 'C');
	return 0;
}

【输出结果】
请添加图片描述
【程序分析】
调用递归函数Hanoi,其终止条件是Hanoi函数的参数n的值等于1。显然,此时不必再调用Hanoi函数了,直接执行Move函数即可。
Move函数并未真正的移动盘子,而只是输出移动盘子的步骤。
前面提到将64个盘子从A座移到C座需要移动(2^64-1)次,假设每次移动一个盘子需要1秒,则移动
(2^64-1)次需要大约600亿年。
所以程序中以3个盘子为例,而不是64个盘子。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言 Hanoi(汉诺)塔问题,用递归解决 的相关文章

  • man命令使用指南

    man命令是linux下查找shell命令 函数等使用方法的利器 最简单的使用方式是man lt the thing you want gt 掌握上面那条命令应该也可以满足80 的使用场景了 这里记录一些更加深入的man命令使用的方法 xf
  • Vscode 搭建舒适的 Markdown 编辑环境

    文章目录 1 显示风格2 图片插入3 表格处理4 其他 1 显示风格 使用 Markdown notebook Microsoft xff0c 这个插件可以实现markdown的预览和编辑在同一页面下 xff0c 显示效果如下 外链图片转存
  • 如何启动英伟达TX2的两个CAN口

    英伟达的TX2有两路CAN xff0c 默认情况下是没有启动的 xff0c 通过ifconfig命令可以查看CAN是否启动 xff0c 如果启动了 xff0c 可以看到下面的设备 如果没有相应的设备 xff0c 则说明CAN没有启动起来 通
  • DDR基础

    欢迎关注我的博客网站nr linux com xff0c 图片清晰度和 xff0c 排版会更好些 xff0c 文章优先更新至博客站 DDR全称Double Data Rate Synchronous Dynamic Random Acces
  • OpenCV实验系列之Mask操作

    OpenCV实验系列之Mask操作 注意 xff1a 以下内容根据opencv官网提供的教程结合个人理解所得 xff0c 仅是个人学习笔记 xff0c 可能存在错误或偏差 xff0c 欢迎指正 OpenCV实验系列之Mask操作 Mask矩
  • UART通信可否只接VCC、RXD、TXD而不接GND?

    使用串口登录树莓派时出现的问题 xff1a 将TF卡插入到树莓派 xff0c 然后开启电源 xff0c 采用串口查看登录界面时出现误码 xff0c 最后排查得出是没有共地 那么假设有两款5V单片机 xff0c 独立供电 按理 xff0c 连
  • Linux 网络编程项目 —— FTP 网盘

    文章目录 项目简介知识点描述项目功能指令远程功能指令本地功能指令 使用的关键函数access 函数popen 函数chdir 函数strtok 函数strncmp 函数linux system函数是否执行成功判断方法 基本流程服务端客户端
  • VMware虚拟机

    文章目录 VMware虚拟机联网三种网络连接方式桥接模式联网原理NAT模式联网原理NAT模式配置手动配置网络关于apt命令关于ifconfig命令简介命令格式命令参数使用实例显示网络设备信息 激活状态的 开启 禁用网络 虚拟机内核与逻辑处理
  • 智能无障碍轮椅——ESP8266总体介绍及ESP-01S入门调试

    文章目录 一 ESP8266 介绍二 ESP8266的多种型号1 DT 062 ESP 01和ESP 01S 左边ESP 01S xff0c 右边ESP 01 3 ESP 12F 三 两种开发方式1 AT指令开发方式2 SDK开发方式 四
  • ROS操作系统快速入门

    文章目录 一 简介模块化 分布式的系统设计 二 安装虚拟机与ROS系统安装虚拟机的缺点安装ubuntu20 04 三 ROS系统安装切换镜像源视频教程 四 ROS应用商城APT源简介与指令介绍案例ros应用商城介绍 五 GIthub建立如下
  • Proteus 仿真8086+8255,运行时错误的解决

    要实现的功能 xff1a 通过开关控制流水灯的显示方式 电路原理图 xff1a 汇编源程序 xff1a CODE SEGMENT ASSUME CS CODE START MOV AL 90H OUT 36H AL AGAIN IN AL
  • 7年程序员项目经历归纳总结

    工作五年 xff0c 敲代码7年 xff0c 科研院所 国企 私企都有过经历 xff0c 发现项目的开发过程总是那么的相似 xff0c 过程举例如下 xff08 事实上画个流程图可能更好 xff0c 但是懒得画了 xff09 xff1a 1
  • Ubuntu20.04+ros(noetic)+RealsenseT265+ORB_SLAM3(一)

    noetic安装的很顺利 xff0c 照着官方文档来就行 xff1b Kalibr的编译 xff1a 一开始参考了 Ubuntu16 04 43 RealsenseT265跑通VINS Fusion IATBOMSW的博客 CSDN博客 x
  • 如何开启英伟达TX2的所有USB3.0口

    TX2新烧完系统之后 xff0c 默认只有一个USB3 0口使能了 xff0c 实际上TX2最多可以使能3个USB3 0口 xff0c 在TX2的design guide中 xff0c 可以找到相应的配置说明 xff0c 见下图 TX2默认
  • Ubuntu20.04+ros(noetic)+RealsenseT265+ORB_SLAM3(二)

    终于编译kalibr成功了 xff0c 可以标定t265了 标定分为三个步骤 xff0c 分别是IMU xff0c 双目和联合标定 xff0c 标定过程仍然参考了Ubuntu16 04 43 RealsenseT265跑通VINS Fusi
  • ADRC控制系统离散形式的稳定性证明

    1 引言 这个问题是最近课题组一个师兄的SCI控制论文的一部分 xff0c 应师兄之邀 xff0c 博主贡献了控制系统稳定性的数学证明 博主目前的研究方向跟控制领域毫无关联 xff0c 只负责其中的系统收敛性证明 师兄的控制系统是一个较为一
  • 固定翼无人机的自主降落-Simulink纵向控制仿真

    本项目来源于一项课程设计 xff0c 用于简单固定翼模型的降落 需要模型的请点击下载链接 xff0c 通过积分获取 https download csdn net download nudt zrs 12454986 练习过固定翼飞行的 x
  • 找工作笔试中的常见考点

    1 Java程序初始化执行顺序 xff1a 父类静态变量 父类静态代码块 子类静态变量 子类静态代码块 父类非静态变量 父类非静态代码块 父类构造函数 子类非静态变量 子类非静态代码块 子类构造函数 2 程序运行结果是多少 xff1f pu
  • eclipse修改后无法正常保存文件解决办法

    ctrl 43 s保存修改的代码时报错 window gt Preferences gt General gt Content Types gt Text gt 选中出现保存问题的文件类型 xff08 如JSP xff09 在底部出现 39
  • Ubuntu18.04+ros-melodic (包括Ubuntu16.04+ros-kinetic)乐视奥比中光相机在nano、tx2、PC等设备上的安装与使用,并解决无法显示rgb信息的问题

    2020 12 25修改 xff1a 本文底部所说的无法显示rgb的情况 xff0c 如果你买的是乐视就按照这个来绝对ok 如果你买的是奥比中光的原装正版 xff0c 直接启动launch文件就行了 xff0c 无须再修改端口号 本来用Ki

随机推荐

  • 数据库单表查询教师班级学生信息表

    单表查询实例 以下为单表查询小实验 xff0c 由于没有教师表和学生表数据库文件 xff0c 因此没有运行截图 xff0c 若有语法错误还望大佬们指正 1 查询学生信息表 info student 中的班级信息 Select 班级 span
  • 在用于 GROUP BY 子句分组依据列表的表达式中,不能使用聚合或子查询。

    在用于 GROUP BY 子句分组依据列表的表达式中 不能使用聚合或子查询 示例题目 原因分析 解决方案 示例题目 查询所有学生的平均成绩 显示字段为学号 姓名 平均成绩 题目 查询所有学生的平均成绩 显示字段为学号 姓名 平均成绩 报错情
  • 在查询中进行统计,分组统计,分开统计

    在查询中进行统计 按角色分组算出每个角色按有办公室和没办公室的统计人数 列出角色 xff0c 数量 xff0c 有无办公室 注意一个角色如果部分有办公室 xff0c 部分没有需分开统计 xff09 span class token cons
  • vscode在哪里配置git

    一 安装Git管理工具 xff0c 可上官网安装 xff0c 安装路径https git scm com xff0c 安装路径默认C Program Files Git xff0c 可自行修改 xff0c 这里我是安装在D Program
  • macOS下的串口调试助手——CoolTerm的使用

    很多希望在 macOS 下做嵌入式开发的朋友都苦于没有合适的串口调试软件 xff0c 今天我来介绍分享一下 CoolTerm 这款跨平台串口调试助手 1 下载安装 首先到 CoolTerm 的官方网站 http freeware the m
  • vscode怎么关掉/禁用源代码管理

    问题描述 运行项目时源代码管理自动运行 有时还报错实在不便 而运行本地项目时往往不用进行版本控制 xff0c 也就不需要vscode的源代码管理 解决方法 在设置中搜索GIT Enabled xff0c 将其关闭即可 如果求稳可以一并把gi
  • ‘com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor‘ 已经过时了导致出现返回total总为0的问题

    在配置类中去掉原有的依赖 他已经过时了 去掉之后 添加这个功能更多更新的Bean对象 64 Configuration span class token keyword public span span class token keywor
  • UnsatisfiedDependencyException: Error creating bean with name ‘subjectServiceImpl‘: Unsatisfied depe

    背景 看xml所在的路径不舒服 任性改资源路径 以为idea会帮我更新引用就以身试险了哈哈哈 报错信息是bean出现了创建错误 查了网上大部分的博客 一一排除后还是报错 网上大部分建议总结如下 1 先去排查service实现层有没有添加注解
  • Web server failed to start. Port 9020 was already in use./window环境

    Web server failed to start Port 9020 was already in use Web服务器无法启动 端口9020已在使用中 解决思路 xff1a 端口被占用了 xff0c 需要我们去杀死相应的进程 xff0
  • 怎么删除存在表关联的原有数据库表空间?

    怎么删除原有数据库表空间 xff1f 1 xff1a 查询所有的表空间 select tablespace name from sys dba tablespaces 2 xff1a 删除 普通删除 DROP TABLESPACE MESA
  • oracle数据库还原/finalshell/删除表空间/用户名冲突

    数据库10 0 1 131还原 1 首先进行数据库finalshell的配置 账号 xff1a mesadmin 密码 xff1a 2 加载oracle配置文件 sudo su su oracle source etc profile 3
  • C++中的数据类型及其所占字节

    1 整型 包括 xff1a short xff08 短整型 xff09 xff0c 占2个字节 xff1b int xff08 整型 xff09 xff0c 占4个字节 xff1b long xff08 长整型 xff09 xff0c 占4
  • C语言中的关键字

    C语言共有32个关键字 关键字不能作为常量名 变量名或其他标识符名称 根据关键字的作用 xff0c 可将关键字分为 xff1a 数据类型关键字 控制语句关键字 存储类型关键字和其它关键字这四类 数据类型关键字 xff08 12个 xff09
  • C语言字符串和字符串结束标志

    1 在C语言中 xff0c 是将字符串作为字符数组来处理的 2 C语言规定了一个 字符串结束标志 xff0c 以字符 0 作为结束标志 如果字符数组中存有若干字符 xff0c 前面九个字符都不是空字符 xff08 0 xff09 xff0c
  • C语言字符数组的输入和输出

    字符数组的输入输出有两种方法 xff1a xff08 1 xff09 逐个字符输入输出 用格式符 c 输入或输出一个字符 例如 span class token keyword int span span class token funct
  • android手机开启IPv6(电信)

    安卓手机开启IPv6 xff08 电信 xff09 系统设置找到移动网络 接入点 接入点选择CTNET 接入设置点进去可以找到APN协议 xff0c 选择IPv4 IPv6即可 实测手机这样设置后开热点笔记本 xff0c 能稳定获得ipv6
  • C语言 怎样定义函数

    1 定义函数 C语言要求 xff0c 在程序中用到的所有函数必须要 先定义 xff0c 后使用 定义函数应包括以下几个内容 xff1a xff08 1 xff09 指定函数的名字 xff0c 以便以后按名调用 xff08 2 xff09 指
  • C语言 函数的返回值

    通过函数调用使主调函数能得到一个确定的值 xff0c 这就是函数值 xff08 函数的返回值 xff09 1 函数的返回值是通过函数中的return语句获得的 return语句将被调用函数中的一个确定值带回到主调函数中去 如果需要从被调函数
  • C语言 函数的嵌套调用

    C语言的函数定义是互相平行 独立的 xff0c 也就是说 xff0c 在定义函数时 xff0c 一个函数内不能再定义另一个函数 xff0c 即不能嵌套定义 xff0c 但可以嵌套调用函数 xff0c 即 xff0c 在调用一个函数的过程中
  • C语言 Hanoi(汉诺)塔问题,用递归解决

    问题 古代有一个梵塔 xff0c 塔内有3个座A xff0c B xff0c C 开始时A座上有64个盘子 xff0c 盘子大小不等 xff0c 大的在下 xff0c 小的在上 有一个老和尚想把64个盘子从A作移到C座 xff0c 但规定每