【C语言】图文解析,深入浅出汉诺塔问题

news2025/1/2 4:13:15

在这里插入图片描述

君兮_的个人主页

勤时当勉励 岁月不待人

C/C++ 游戏开发


Hello,这里是君兮_,今天更新一篇我一直想更但是一直没空写的博客——汉诺塔问题,在所有有关递归的问题中,汉诺塔问题是最经典的问题之一,可以说,如果你能真正理解汉诺塔问题的内核,你的递归也一定不会太差,今天就来带大家深入浅出汉诺塔问题。

深入浅出汉诺塔问题

  • 什么是汉诺塔?
  • C语言实现汉诺塔
    • 具体解决汉诺塔问题思路分析
      • 当需要A上需要移动的盘子n=2时
      • 当需要A上需要移动的盘子n=3时
      • 当需要A上需要移动的盘子n=4时
      • 当需要A上需要移动的盘子为n时
    • 实现汉诺塔问题的代码
  • 总结

什么是汉诺塔?

  • 汉诺塔(Tower of Hanoi)源自印度古老传说的一个游戏,大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,并且在移动时三根柱子之间一次只能移动一个圆盘。

C语言实现汉诺塔

具体解决汉诺塔问题思路分析

  • 从上面的对于汉诺塔问题的说明我们可以得到这样一个结论

  • 如果要把A柱上的盘子全部都移动到C柱上,要遵循以下规则:

  • 1.每次只能移动A柱最上面的一个盘子

  • 2.小盘子上不能放大盘子。

我们来一步一步分析,首先设此时A中有n个盘子,我们现在的目标是借助B柱把A上的盘子全部移动到C柱上

当需要A上需要移动的盘子n=2时

  • 这个很简单我就不画图啦!
  • 我们只需要先把A最上面的盘子移到B上,再把A另一个盘子移到C上,最后把B上盘子移到C上即可。

当需要A上需要移动的盘子n=3时

在这里插入图片描述

  • 将2个盘子从A移动到B上。重复n=2时的步骤,此时是将那2个盘子从A借助C移动到B

在这里插入图片描述

  • 接着,把A上的盘子移动到C上
    在这里插入图片描述
  • 将B上的2个盘子移动到C上。重复n=2时的步骤,此时是将那2个盘子从B借助A移动到C
    在这里插入图片描述

当需要A上需要移动的盘子n=4时

在这里插入图片描述

  • 将3个盘子从A移动到B上。重复n=3时的步骤,与n=3不同之处在于,我们此时是借助C把A上盘子移到B
    在这里插入图片描述

  • 将A上最后一个盘子移动到C上
    在这里插入图片描述

  • 将B上的3个盘子移动到C上。重复n=3时的步骤,与n=3不同之处在于,我们此时是借助A把B上盘子移到C
    在这里插入图片描述

当需要A上需要移动的盘子为n时

  • 怎么样,经过上面的讲解你发现规律了吗?
  • 也就是说,对于任意一个大于1的正整数n,如果有一个n层汉诺塔的问题,我们就可以将之分解为两个n-1层汉诺塔问题求解

实现汉诺塔问题的代码

  • 通过我们上面的分析,我们就可以把这个问题看成这三步:

  • 1.将A上n-1层的盘子通过C移动到B上

  • 2.将此时A上剩余的盘子移动到C上

  • 3.将B上此时n-1层的盘子通过A移动到C上


  • 参考代码如下:
#include<stdio.h>

void Move (char A, char C, int n)
{
	printf("把第%d个盘子从%c--->%c\n", n, A, C);
}

void HanoiTower(char A, char B, char C, int n)
{
	if (n == 1)
	{
		Move(A, C, n);
	}
	else
	{
		//将n-1个盘子从A柱借助于C柱移动到B柱上
		HanoiTower(A, C, B, n - 1);
		//将A柱最后一个盘子移动到C柱上
		Move(A, C, n);
		//将n-1个盘子从B柱借助于A柱移动到C柱上
		HanoiTower(B, A, C, n - 1);
	}
}

int main()
{
	int n = 0;
	printf("输入A柱子上的盘子个数:");
	scanf("%d", &n);
	//将n个盘子从A柱借助于B柱移动到C柱上
	HanoiTower('A', 'B', 'C', n);
	return 0;
}

在这里插入图片描述


总结

  • 今天的内容暂时到这里就结束了,我们今天通过递归的方式具体解决了汉诺塔问题。如果你还有问题的话一定要自己试一下,不然光看是非常容易遗忘并且非常不容易理解的,咱们必须反复的练习才能熟悉起来!

  • 好了,如果你有任何疑问欢迎在评论区或者私信我提出,大家下次再见啦!

新人博主创作不易,如果感觉文章内容对你有所帮助的话不妨三连一下这个新人博主再走呗。你们的支持就是我更新的动力!!!

**(可莉请求你们三连支持一下博主!!!点击下方评论点赞收藏帮帮可莉吧)**

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GitGithub 上手就是这么简单!

Git 和 Github 对程序员或计算机爱好者来说肯定都不陌生&#xff0c;这个不多说&#xff01;下面要做的就是带你光速掌握 git 和 github 的日常操作&#xff0c;让你做到心中有数。 我们为什么要学习Git&Github&#xff1f;嗯… 相信你是带着目的学习的&#xff01; 不过…

Nginx三大核心功能

一、反向代理&#x1f349; (1)什么是正向代理&#x1f95d; 概念 正向代理是一个位于客户端和目标服务器之间的代理服务器&#xff08;中间服务器&#xff09;。为了从目标服务器取得内容&#xff0c;客户端向代理服务器发送一个请求&#xff0c;并且指定目标服务器&#xf…

Lion:闭源大语言模型的对抗蒸馏

Lion&#xff1a;闭源大语言模型的对抗蒸馏 Lion&#xff0c;由香港科技大学提出的针对闭源大语言模型的对抗蒸馏框架&#xff0c;成功将 ChatGPT 的知识转移到了参数量 7B的 LLaMA 模型&#xff08;命名为 Lion&#xff09;&#xff0c;在只有 70k训练数据的情况下&#xff0…

白嫖一份小白到进阶网络安全学习宝典【建议收藏】

前言 想学网络安全但是无从下手的小白看过来&#xff0c;非常系统的学习资料&#xff0c;无数小白看了这份资料都已经成功入门&#xff0c;涵盖多个网络安全知识点&#xff0c;我愿称之为网络安全自学宝典。 一、概念性知识 1、了解什么是网络安全 2、清楚法律法规 3、网络安…

【ElatsticSearch】ES索引库与文档的增删改查

文章目录 一、操作索引库1、mapping映射属性2、索引库的CRUD 二、文档操作1、新增文档2、查询文档3、删除文档4、修改文档5、注意点 一、操作索引库 1、mapping映射属性 mapping是对索引库中文档的约束&#xff0c;常见的mapping属性包括&#xff1a; type&#xff1a;字段数…

【计算机视觉 | 图像分割】arxiv 计算机视觉关于图像分割的学术速递(7 月 4 日论文合集)

文章目录 一、分割|语义相关(18篇)1.1 TomatoDIFF: On-plant Tomato Segmentation with Denoising Diffusion Models1.2 CGAM: Click-Guided Attention Module for Interactive Pathology Image Segmentation via Backpropagating Refinement1.3 RefSAM: Efficiently Adapting …

Python实现通过GUI界面提交参数,来启动python脚本

前言 本文是该专栏的第30篇,后面会持续分享python的各种干货知识,值得关注。 假设现在有如下需求,用python写一个GUI界面,在该GUI界面上输入参数信息,然后再点击GUI界面上的提交按钮,启动并执行对应的python脚本。换言之,在GUI界面上输入的参数信息传递给对应的python脚…

图像处理常用算法(基础)

同图像灰度不同,边界处一般会有明显的边缘,利用此特征可以分割图像。需要说明的是:边缘和物体间的边界并不等同,边缘指的是图像中像素的值有突变的地方,而物体间的边界指的是现实场景中的存在于物体之间的边界。有可能有边缘的地方并非边界,也有可能边界的地方并无边缘,…

【动态规划算法练习】day14

文章目录 一、97. 交错字符串1.题目简介2.解题思路3.代码4.运行结果 二、712. 两个字符串的最小ASCII删除和1.题目简介2.解题思路3.代码4.运行结果 三、718. 最长重复子数组1.题目简介2.解题思路3.代码4.运行结果 总结 一、97. 交错字符串 1.题目简介 97. 交错字符串 给定三个…

嵌入式如何面试10家公司,拿到9个offer的?

又快到一年一度的秋招季&#xff0c;不少同学私信学长吐苦水&#xff0c;明明在各大招聘网站上海投了那么多家公司&#xff0c;收到的面试通知却屈指可数&#xff0c;好不容易拿到面试机会&#xff0c;却在一面就扑街...... 很多同学能力还行&#xff0c;但是经验谈不上很出彩&…

【IMX6ULL驱动开发学习】15.IMX6ULL驱动开发问题记录(sleep被kill_fasync打断)

发现问题的契机&#xff1a; 学习异步通知的时候&#xff0c;自己实现一个功能&#xff1a;按键控制蜂鸣器&#xff0c;同时LED灯在闪烁 结果&#xff1a;LED好像也同时被按键控制了 最后调试结果发现&#xff1a; 应用层的sleep被驱动层的kill_fasync打断&#xff0c;所以sle…

GB/T 3596-2008 购买线材时,判断线材标称直径和载流的方法

文章目录 GB/T 3596-2008 购买线材时,判断线材标称直径和载流的方法概述笔记老国标 - 判断线材标称直径的方法END GB/T 3596-2008 购买线材时,判断线材标称直径和载流的方法 概述 在淘宝上买线材, 买了RV1.5/RV1.0各买了4种颜色(红/黑/黄绿/蓝). 看到评论区, 有人留言, 说线径…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(7 月 3 日论文合集)

文章目录 一、检测相关(9篇)1.1 Federated Ensemble YOLOv5 - A Better Generalized Object Detection Algorithm1.2 Zero-shot Nuclei Detection via Visual-Language Pre-trained Models1.3 Federated Object Detection for Quality Inspection in Shared Production1.4 Comp…

Raw Socket 之网络层数据获取

目录 简介正常使用tcpdump程序与分析报文理解参考 简介 针对网络包&#xff0c;我们一般的发送接收直接使用的是应用层&#xff0c;此时无法分辨接收为广播包还是单播包&#xff0c;为了能够分辨出接收到的是否为广播包&#xff0c;需要接收数据链路层的数据或者网络层的数据。…

ct.js笔记-加载字体时字体名不能包含中文

这个和Qt很像&#xff0c;在开发过程中尽量避免使用中文。如下&#xff1a; 这个AaJH中文&#xff0c;在加载时&#xff1a; this.nickNameLabel new PIXI.Text(Your text here, ct.styles.get(AaJH中文)); this.addChild(this.nickNameLabel);this.nickNameLabel.x 30; thi…

UE5接入在线直播视频源,如hls(m3u8)格式

文章目录 1.实现目标2.实现过程2.1 VlcMedia插件重编译2.2 UE5接入在线直播2.3 创建材质3.参考资料1.实现目标 通过重编译VlcMedia插件,以支持在线直播视频在UE5中的播放,GIF动图如下: 2.实现过程 本文主要包括插件的重编译、在线直播视频的接入,以及材质的创建三个部分。…

基于Java办公用品管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

atomic原子操作

当一个程序中的两个线程同时向这个程序里的全局变量增加数时会发生什么&#xff1f; 理论上来说&#xff0c;应该是200000&#xff0c;但是最后结果不是200000。 这是多个线程同时操作一个全局变量引起的错误。 要解决这个错误&#xff0c;用互斥锁即可&#xff1a; 这样就可以…

【计算机视觉】DETR 系列的最新综述!

论文地址&#xff1a; https://arxiv.org/pdf/2306.04670.pdf项目地址&#xff1a; https://github.com/mindgarage-shan/trans_object_detection_surveyTransformer在自然语言处理(NLP)中的惊人表现&#xff0c;让研究人员很兴奋地探索它们在计算机视觉任务中的应用。与其他…

Spark | 性能调优原理与步骤 | 案例讲解

&#x1f525; 跟着梁哥打卡一波spark的性能调优&#xff5e; 文章目录 1、Spark调优原理与步骤2、Spark任务UI监控3、Spark调优案例3.1、资源配置优化3.2、利用缓存减少重复计算3.3、数据倾斜调优3.4、broadcastmap代替join3.5、reduceByKey/aggregateByKey代替groupByKey 1、…