C语言实现汉诺塔问题

2023-05-16

目录

一、程序

1.实现代码

2.程序执行结果

二、背景

1.汉诺塔问题描述

2.直观理解

3.思考过程

 三、函数执行过程

 举例 n=2

 四、总结

递归问题


一、程序

1.实现代码

#include <stdio.h>
/*
函数名: move
功能: 移动一次盘子,并在屏幕上打印
参数:a:移动一次的起点
      b:移动一次的终点
返回值:无
*/
void move(char a, char b) 
{
printf("%c->%c\n", a, b);
}
/*
函数名: hanoi
功能: 把n个盘子从x柱子上经由y柱子移动到z柱子
参数:n:盘子个数
      x:盘子位于x柱子上
	  y:要经过y柱子
	  z:最终全部移动到z柱子上
返回值:无
*/
void hanoi(int n, char x, char y, char z)
{
	if (n == 1) {
		move(x, z);
	}
	else {
		hanoi(n - 1, x, z, y);//步骤一:把n-1个盘子从x柱子上经由z柱子移动到y柱子
		move(x, z);//步骤二:把盘子从x柱子移动到z柱子
		hanoi(n - 1, y, x, z);//步骤三:把n-1个盘子从y柱子上经由x柱子移动到z柱子
	}
}
int main() 
{
	int n = 0;
	printf("请输入盘子个数:");
	scanf("%d", &n);//键盘输入盘子个数,存放在n中
	hanoi(n, 'a', 'b', 'c');//调用函数
	return 0;
}

2.程序执行结果

输入3

 输入4

 (可以输入更大的数)

二、背景

1.汉诺塔问题描述

给定三根柱子,记为 A,B,C ,其中 A柱子上有 n个盘子,且上面的盘子一定比下面的盘子小。

问:如何将 A 柱上的盘子经由 B柱移动到 C 柱。

​移动时应注意:① 一次只能移动一个盘子 ;②大的盘子不能压在小盘子上。

2.直观理解

一个盘子时:

两个盘子时:

三个盘子时:

 思考n个盘子时?

3.思考过程

这样一个复杂的问题可以拆解为三个步骤:

步骤一:把n-1个盘子从A柱移动到B柱

步骤二:把1盘子从A柱移动到C柱

步骤三:把n-1个盘子从B柱移动到C柱

 其中步骤二可以一步完成,步骤一和步骤三无法一步完成。但是步骤一和步骤三又可以分别拆解为三个步骤。这样一直递归,直到每个步骤都可以完成。

综上,该问题解决方法为:

 用函数描述为:

 函数hanoi参数的值由n逐渐递减为n-1,n-2,n-3,......,2,1

 三、函数执行过程

 举例 n=2

(n更大时过程类似)

 四、总结

递归问题

汉诺塔问题是典型的递归问题,递归就是将复杂的问题,找到可以重复的自相似部分,化解为简单的小问题。

递归问题的两个必要条件:

1.存在限制条件,当满足这个限制条件的时候,递归便不再继续;

2.每次递归调用之后越来越接近这个限制条件。

编写的递归代码必须满足以上两个条件,否则会造成递归无法结束,出现栈溢出错误。

上述代码满足了两个必要条件:

1.if(n==1)是限制条件;

2.每次函数的参数n减1,越来越接近限制条件n==1。

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

C语言实现汉诺塔问题 的相关文章

随机推荐

  • 操作系统实践课作业(南航)

    操作系统实践课作业 xff08 南航 xff09 文章目录 操作系统实践课作业 xff08 南航 xff09 1 job21 1 main c1 2 math c1 3 Makefile 2 job32 1 myecho c2 2 myca
  • 在Linux系统下安装Neo4j图数据库

    在Linux系统下安装Neo4j图数据库 文章目录 在Linux系统下安装Neo4j图数据库1 Java JDK1 1 安装1 2 查看安装路径 2 Neo4j2 1 下载2 2 拷贝到容器中2 3 修改neo4j conf配置文件2 4
  • 大数定律 与 中心极限定理 的理解

    目录 1 大数定律 2 中心极限定理 1 大数定律 当样本的数量足够大时 xff0c 样本的统计特性就可以近似代表总体的统计特性 大数 是指样本的数量足够大或者试验的次数足够多 2 中心极限定理 设总体为 为总体的 N 个样本集 xff0c
  • 操作系统实践05—文件描述符和系统调用

    操作系统实践05 文件描述符和系统调用 文章目录 操作系统实践05 文件描述符和系统调用1 概念1 1 文件描述符1 2 系统调用1 3 例子 2 内核实现2 1 file结构体2 2 文件描述符表2 3 进程控制块2 4 私有的文件描述符
  • 医疗问答机器人项目部署

    医疗问答机器人项目部署 文章目录 医疗问答机器人项目部署1 拉取TensorFlow镜像2 配置系统环境2 1 更换软件源2 2 下载vim2 3 解决vim中文乱码问题2 4 安装Neo4J图数据库2 5 安装网络工具包 3 运行项目3
  • SimpleITK学习

    SimpleITK学习 文章目录 SimpleITK学习1 SimpleITK ReadImage path 2 SimpleITK GetArrayFromImage itk img 3 itk img GetOrigin 4 itk i
  • 【Docker】服务器部署项目

    服务器部署项目 文章目录 服务器部署项目1 远程连接服务器2 在Linux系统上安装Docker2 1 卸载旧版本2 2 使用 APT 安装2 3 安装Docker2 4 使用脚本自动安装2 5 启动Docker2 6 测试 Docker
  • 计算机网络04—网络层

    网络层 学习参考资料 xff1a 湖南科技大学 计算机网络谢希仁 计算机网络 xff08 第7版 xff09 文章目录 网络层1 概述1 1 IP协议及配套协议 2 两种服务2 1 面向连接的虚电路服务2 2 无连接的数据报服务2 3 对比
  • torch.nn学习

    torch nn学习 文章目录 torch nn学习1 卷积层1 1 Conv2d 2 池化层2 1 MaxPool2d2 2 MaxUnpool2d2 3 AvgPool2d 3 代码实践3 1 Inception Module3 2 R
  • 深度学习基础知识点【更新中】

    深度学习基础知识点 文章目录 深度学习基础知识点1 数据归一化2 数据集划分3 混淆矩阵4 模型文件5 权重矩阵初始化6 激活函数7 模型拟合8 卷积操作9 池化操作10 深度可分离卷积11 转置卷积 1 数据归一化 过大的输入数据未归一化
  • VS Code配置C/C++环境

    VS Code配置C C 43 43 环境 文章目录 VS Code配置C C 43 43 环境1 下载Visual Studio Code2 下载MinGW3 VS Code设置3 1 下载插件3 2 新建工作区3 3 C 43 43 环
  • 计算机网络05—运输层

    运输层 学习参考资料 xff1a 湖南科技大学 计算机网络谢希仁 计算机网络 xff08 第7版 xff09 文章目录 运输层1 概述1 1 两个主要协议1 2 端口 2 用户数据报协议UDP3 传输控制协议TCP3 1 概述3 2 可靠运
  • 【2022春招研发】字节笔试记录(测试方向)

    20220410字节笔试 测试方向 文章目录 20220410字节笔试 测试方向一 编程题2道 xff08 50分 xff09 二 单选题10道 xff08 20分 xff09 三 多选题10道 xff08 30分 xff09 一 编程题2
  • 浏览器主页被劫持篡改了怎么办

    就想下载个驱动 xff0c 结果一通操作把我的 Edge 浏览器主页篡改成了 桔梗网 xff0c 就下面这个网站 算了不喷它了 xff0c 来说说怎么改回去吧 其他浏览器的修改方式相同 找到 Microsoft Edge 浏览器的桌面快捷方
  • 【2022春实习】百度笔试记录(机器学习/数据挖掘/自然语言)

    20220412百度笔试 机器学习 数据挖掘 自然语言 文章目录 20220412百度笔试 机器学习 数据挖掘 自然语言一 选择题30道 xff08 60分 xff09 二 问答题1道 xff08 20分 xff09 三 系统设计题1道 x
  • 【算法工程师】华为技术面面试记录

    20220419华为技术面 面试岗位是算法工程师 文章目录 20220419华为技术面1 自我介绍 2 算法题3 专业知识3 1 数据结构3 2 计算机网络3 3 操作系统3 4 设计模式3 5 机器学习3 6 其他 4 提问环节 1 自我
  • 操作系统实践06—线程

    操作系统实践06 线程 文章目录 操作系统实践06 线程1 创建线程1 1 原型1 2 线程参数1 3 参数类型1 4 例子一1 5 例子二 2 等待线程2 1 原型2 2 线程返回值2 3 例子一2 4 例子二 3 线程互斥3 1 初始化
  • VS Code指定扩展安装位置

    VS Code指定扩展安装位置 默认情况下 xff0c Windows vscode的安装路径为C Users 用户名 vscode extensions 如果想要自定义扩展的安装路径 xff0c 无法直接在vscode中修改 但是 xff
  • Ubuntu 网络配置顺序:(Ubuntu 16.4)

    网络配置顺序 xff1a xff08 Ubuntu 16 4 xff09 1 xff0c 网卡硬件 xff08 硬件 vm DHCP用NAT直接到物理网 xff0c 静态用桥接通过本地网络链接转发 xff09 xff0c 2 xff0c 系
  • C语言实现汉诺塔问题

    目录 一 程序 1 实现代码 2 程序执行结果 二 背景 1 汉诺塔问题描述 2 直观理解 3 思考过程 三 函数执行过程 举例 n 61 2 四 总结 递归问题 一 程序 1 实现代码 include lt stdio h gt 函数名