汉诺塔(函数递归)

news/2024/7/7 19:09:06

前言
汉诺塔问题是一个经典的数学谜题,也是函数递归的一个经典问题,起源于印度。问题的设定是有三个柱子,第一个柱子上有一组不同大小的圆盘,按照从上到下依次变大的顺序摆放。目标是将所有的圆盘从第一个柱子移动到第三个柱子上,但是在移动过程中必须遵守以下规则:
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时结果是这样的
在这里插入图片描述

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


http://lihuaxi.xjx100.cn/news/1888240.html

相关文章

Android 动画 Lottie 如何使用

Android 动画 Lottie 如何使用 一、简介 Lottie 是Airbnb开源的一个面向 iOS、Android、React Native 的动画库&#xff0c;能分析 Adobe After Effects 导出的动画&#xff0c;并且能让原生 App 像使用静态素材一样使用这些动画&#xff0c;完美实现动画效果。 二、Lottie动…

logback日志打印操作人

logback日志打印操作人 自定义拦截器 package com.demo.dv.net.config;import com.demo.dv.net.common.domain.UserInfo; import com.demo.dv.net.common.utils.CurrentUserUtil; import org.slf4j.MDC; import org.springframework.stereotype.Component; import org.spring…

第十四届蓝桥杯省赛 Python B 组 D 题——管道(AC)

目录 1. 管道1. 问题描述2. 输入格式3. 输出格式4. 样例输入5. 样例输出6. 评测用例规模与约定 2. 解题思路3. AC_Code 1. 管道 1. 问题描述 有一根长度为 len \text{len} len 的横向的管道&#xff0c;该管道按照单位长度分为 len \text{len} len 段&#xff0c;每一段的中…

mysql的负向条件查询会不会使用索引

mysql的负向条件查询&#xff0c;例如not in&#xff0c;会不会使用索引&#xff1f; 其实&#xff0c;mysql还是会尽量利用索引。如果查询的列上有索引&#xff0c;并且索引能够覆盖查询所需的列&#xff0c;那么mysql可能会使用索引来获取结果&#xff0c;而不是进行全表扫描…

C++ 11 -- 初步认识智能指针

一.RAII 1.1 RAII的概念 一般情况下&#xff0c;C申请资源后都需要手动释放资源&#xff0c;一旦忘记资源的释放就会造成内存泄漏&#xff0c;为了解决内存泄漏问题&#xff0c;C引入了RAII机制。 RAII是一种利用对象的生命周期来控制资源释放的技术。比如一个局部对象&#x…

谷歌上架应用的机审流程或审核机制是怎么样的?

Google play是全球最大安卓应用市场&#xff0c;拥有巨大的流量&#xff0c;是开发者们上架应用的首选平台。不过&#xff0c;开发者们的应用需要经过谷歌严格审核&#xff0c;确保符合谷歌应用相关政策和法律法规才能成功上架。 众所周知&#xff0c;谷歌审核系统&#xff0c…

基于FPGA的视频接口之高速IO(SATA)

简介 本章节是对于高速IO接口应用的一个扩展,目前扩展为SATA(SSD硬盘,机械硬盘不能使用)。通俗易懂的讲,即把SSD硬盘当做大型的Nand Flash来处理,不格式化硬盘,直接以地址和数据的格式,在SATA盘中写入数据,该数据不能被Window和linux直接识别,需单独编写App来查看SSD…

docker安装rabbitmq并安装死信队列插件

环境 debian11 docker 20.10.22 rabbitmq 3.10.0 拉取镜像到本地 docker pull rabbitmq3.10.0 实例化 docker run -d --name rabbit -e RABBITMQ_DEFAULT_USERadmin -e RABBITMQ_DEFAULT_PASSadmin -p 15672:15672 -p 5672:5672 -p 25672:25672 -p 61613:61613 -p 1883:…