汉诺塔(函数递归)

前言
汉诺塔问题是一个经典的数学谜题,也是函数递归的一个经典问题,起源于印度。问题的设定是有三个柱子,第一个柱子上有一组不同大小的圆盘,按照从上到下依次变大的顺序摆放。目标是将所有的圆盘从第一个柱子移动到第三个柱子上,但是在移动过程中必须遵守以下规则:
1,每次只能移动一个圆盘。
2,每次移动时,只能将一个圆盘从柱子的顶端移到另一个柱子的顶端。
3,不允许将大圆盘放在小圆盘的上面。
在了解了规则之后我们该怎么样用函数递归的方式解决它呢?那么话不多说我们现在开始。
在这里插入图片描述
函数递归讲究一种由大化小的思想。
首先我们要定义一个函数hanoi(int n,char pos1 ,char pos2 ,char pos3)
首先n代表有n个盘子,pos1是起始位置,pos2是中转位置,pos3是目的位置。
然后我们在定义一个move函数move(char pos1,char pos2)将pos1的盘子移动到pos2上我们先写一下简单的move函数

void move(char pos1, char pos2)
{
	printf("%c -> %c ", pos1, pos2);
}

在这里插入图片描述
如图分别有三个柱子a,b,c,我们的目的是将a上的n个盘子移动到c上。当n=1时我们可以直接将盘子从a移到c。所以我们先这样写。

void hanoi(int n, char pos1, char pos2, char pos3)
{
	if (n == 1)
	{
		move(pos1, pos3);
	}
	else
	{
	
	}
}

当n不等于1时,我们的主要思想是现将a上的n-1个盘子移动到b上,然后将a上剩余的一个盘子移动到c上。如图。
在这里插入图片描述
那么此时我们要把n-1个盘子从a移动到b,即起始位置是a,目的位置自然是b,那c就是我们的中转位置。那么我们开始写代码。

void hanoi(int n, char pos1, char pos2, char pos3)
{
	if (n == 1)
	{
		move(pos1, pos3);
	}
	else
	{
	hanoi(n-1,pos1,pos3,pos2);//此时pos2是目的位置,pos1是起始位置
	move(pos1,pos3);//将a上的那一个放到c上
	}
}

接下来我们需要把b上的n-1个放到c上,此时我们的b就是起始位置,c是目的位置,而a就是中转位置。如图所示。
在这里插入图片描述
到这里我们发现就完成了任务那么我们再写一下代码。

void hanoi(int n, char pos1, char pos2, char pos3)
{
	if (n == 1)
	{
		move(pos1, pos3);
	}
	else
	{
	hanoi(n-1,pos1,pos3,pos2);//此时pos2是目的位置,pos1是起始位置
	move(pos1,pos3);//将a上的那一个放到c上
	hanoi(n-1,pos2,pos1,pos3);//此时pos2是起始位置,pos3是目的位置
	}
}

这样我们的hanoi函数就写好了下面我们来演示。

#include<stdio.h>
void move(char x, char y)
{
	printf("%c -> %c ", x, y);
}
void hanoi(int n, char pos1, char pos2, char pos3)
{
	if (n == 1)
	{
		move(pos1, pos3);
	}
	else
	{
		hanoi(n - 1, pos1, pos3, pos2);//此时pos2是目的位置,pos1是起始位置
		move(pos1, pos3);//将a上的那一个放到c上
		hanoi(n - 1, pos2, pos1, pos3);//此时pos2是起始位置,pos3是目的位置
	}
}
int main()
{
	int n;
	scanf("%d", &n);//输入共有n个盘子
	char a = 'A', b = 'B', c = 'C';
	hanoi(n,a,b,c);
	return 0;
}

输入n=4时结果是这样的
在这里插入图片描述

尾声
关于函数递归经典问题汉诺塔的分享就到这里,如果觉得博主讲的不错请给博主一个赞和收藏鼓励一下博主,关注博主不迷路,我们下期再见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/241136.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Java SSM框架实现东理咨询交流论坛系统项目【项目源码+论文说明】

基于java的SSM框架实现东理咨询交流论坛系统演示 摘要 在网络高速发展的时代&#xff0c;众多的软件被开发出来&#xff0c;给用户带来了很大的选择余地&#xff0c;而且人们越来越追求更个性的需求。在这种时代背景下&#xff0c;人们对东理咨询交流论坛越来越重视&#xff0…

Odoo:行业领先的免费开源供应链管理系统

先进且开源的供应链管理系统和全球供应链协作优化方案 为满足复杂的供应链和库存管理要求&#xff0c;如今绝大多数企业都不得不部署多个供应链管理软件和库存管理系统软件。如何利用一个库存管理与供应链管理软件&#xff0c;跨地区、跨时区地管理现代供应链&#xff1f;Odoo…

Java网络编程-深入理解BIO、NIO

深入理解BIO与NIO BIO BIO 为 Blocked-IO&#xff08;阻塞 IO&#xff09;&#xff0c;在 JDK1.4 之前建立网络连接时&#xff0c;只能使用 BIO 使用 BIO 时&#xff0c;服务端会对客户端的每个请求都建立一个线程进行处理&#xff0c;客户端向服务端发送请求后&#xff0c;…

免费!简单优雅的手机视频制作PR模板抖音素材下载

这是一款多功能的Premiere Pro模板&#xff0c;无论你是为视频、宣传内容还是社交媒体帖子短视频&#xff0c;这个pr模板都会为你的项目增添一丝优雅和专业。适用于广播&#xff0c;俱乐部&#xff0c;音乐会&#xff0c;舞蹈&#xff0c;设计&#xff0c;宣传片&#xff0c;动…

什么是前端国际化(internationalization)和本地化(localization)?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

基于QTreeWidget实现带Checkbox的多级组织结构选择树

基于QTreeWidget实现带Checkbox的多级组织结构选择树 采用基于QWidgetMingw实现的原生的组织结构树 通过QTreeWidget控件实现的带Checkbox多级组织结构树。 Qt相关系列文章&#xff1a; 一、Qt实现的聊天画面消息气泡 二、基于QTreeWidget实现多级组织结构 三、基于QTreeWidget…

“新华三杯”第十届成都信息工程大学ACM程序设计竞赛(同步赛)L. 怎么走啊(最短路+二分 分段函数)

题目 登录—专业IT笔试面试备考平台_牛客网 思路来源 衡阳师范学院ac代码、pj学弟 题解 大致可以证明&#xff0c;在w从1e5减小到1的过程中&#xff0c; 之前某条反向边没有用到&#xff0c;现在需要用到反向边&#xff0c;也就是正向边用到的变少了 这样的变化有sqrt个&a…

【Django中间价】项目中常用中间件

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、常见用法二、JWT中间价三、操作日志中间件1.在user的app下建立models类2.如图位置新建LogMiddleware.py3.django中添加中间件 四、全…

Pandas缺失数据处理

好多数据集都含缺失数据&#xff0c;缺失数据有多重表现形式 数据库中&#xff0c;缺失数据表示为NULL 在某些编程语言中用NA表示 缺失值也可能是空字符串&#xff08;’’&#xff09;或数值 在Pandas中使用NaN表示缺失值&#xff1b; NaN简介 Pandas中的NaN值来自NumPy库&a…

IPQ6010 vs IPQ8072 What’s the difference?|802.11AX WiFi6 Solution DR6018 DR8072

IPQ6010 vs IPQ8072 What’s the difference?|802.11AX WiFi6 Solution DR6018 DR8072 IPQ6010 vs IPQ8072: In-Depth Comparison and Selection Guide The rapid evolution of networking technologies has driven continuous innovation in routers and network devices. Am…

msvcp80.dll文件丢失怎么恢复?详解多种DLL文件修复方法

本文将为您详细介绍msvcp80.dll的定义、作用以及丢失的原因&#xff0c;并提供5个解决方法&#xff0c;帮助您解决这一问题。 一、msvcp80.dll是什么&#xff1f; msvcp80.dll是Microsoft Visual C Runtime Library中的一个动态链接库文件&#xff0c;它包含了许多C运行库函数…

SIM卡内部结构及外部物理接口

1. 内部组成 “SIM卡”是一个装有微处理器的芯片卡&#xff0c;它的内部有5个模块&#xff1a;1.微处理器CPU&#xff1a;控制SIM卡的运算和操作2.程序存储器ROM&#xff1a;存放片内操作系统&#xff0c;用户不可操作。3.工作存储器RAM&#xff1a;存放计算过程中的临时数据4…

Video anomaly detection with spatio-temporal dissociation 论文阅读

Video anomaly detection with spatio-temporal dissociation 摘要1.介绍2.相关工作3. Methods3.1. Overview3.2. Spatial autoencoder3.3. Motion autoencoder3.4. Variance attention module3.5. Clustering3.6. The training objective function 4. Experiments5. Conclusio…

基于Dockerfile创建镜像

Docker镜像的创建 1.基于现有镜像创建 //首先启动一个镜像&#xff0c;在容器里做修改 docker run -itd --name web centos:7 /bin/bash #启动容器docker exec -it web bash #进入容器​ yum install -y epel-release #安装epel源 yum install -y nginx #安装nginx …

共享门店会在未来新零售占据主角吗?

共享门店作为一种创新的商业模式&#xff0c;在未来新零售领域中可能会占据一定的角色&#xff0c;但具体是否会成为主角&#xff0c;还需要根据市场的发展和技术的进步来判断。 首先&#xff0c;共享门店模式通过资源共享、风险共担、客户共享和收益共享等方式&#xff0c;为…

Python 递归及目录遍历

递归调用&#xff1a;一个函数&#xff0c;调用了自身&#xff0c;称为递归调用 递归函数&#xff1a;一个会调用自身的函数 凡是循环能做的事&#xff0c;递归都能做。 目录 递归示例 普通方法实现 递归方式实现 计算分析&#xff1a; 递归遍历目录 引入os 遍历目录 执…

Unity | 渡鸦避难所-2 | 搭建场景并添加碰撞器

1 规范项目结构 上期中在导入一系列的商店资源包后&#xff0c;Assets 目录已经变的混乱不堪 开发过程中&#xff0c;随着资源不断更新&#xff0c;遵循一定的项目结构和设计规范是非常必要的。这可以增加项目的可读性、维护性、扩展性以及提高团队协作效率 这里先做下简单的…

【BigDecimal类—常用API系列】解决java浮点计算精度损失问题

文章目录 Java浮点计算精度损失问题BigDecimal进行精确运算的解决方案 Java浮点计算精度损失问题 BigDecimal它是干什么用的呢&#xff1f;什么是java浮点计算精度损失问题&#xff1f;我们先看一段代码&#xff0c;看这个代码有什么问题&#xff1f;再说BigDeimal这个类是干什…

【机器学习】亚马逊云科技基础知识:以推荐系统为例。你知道机器学习的关键所在么?| 机器学习管道的各个阶段及工作:以Amazon呼叫中心转接问题为例讲解

有的时候,暂时的失利比暂时胜利要好得多。 ————经典网剧《mao pian》,邵半仙儿 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌿[2] 2023年城市之星领跑者TOP1(哈尔滨)🌿 🌟[3] 2022年度博客之星人工智能领域TOP

深入了解—C++11特性

目录 一、 C11简介 二、初始化列表 2.1 C98中{}的初始化问题 2.2 内置类型的列表初始化 2.3 自定义类型的列表初始化 2.3.1. 标准库支持单个对象的列表初始化 2.3.2. 多个对象的列表初始化 三、变量类型推导 3.1 为什么需要类型推导 3.2 decltype类型推导 3.2.1. 推…