当前位置: 首页 > news >正文

汉诺塔问题代码写法的详细解析

汉诺塔游戏规则:

规则:

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

        这篇文章不讲汉诺塔的玩法和实现过程,只讲代码为何那么写,又是怎样一步一步实现的。其他的基础你们可以去搜索引擎搜索

        其实汉诺塔问题难不是难在理解,而是难在程序编写的时候,很多人理解了汉诺塔的游戏规则也知道怎么去操作,但是在写代码的时候就懵了,下面举个代码的例子(其他语言也是一样的,重要的是先了解思路

很多人是在参数变换这里不理解,下面我会一步一步的来解析代码每一步的执行过程以及为什么要变换柱子

我们先举例两个圆盘的情况

#include <stdio.h>void hannuota(int n,char A,char B,char C){if(n == 1)printf("将编号为 %d 的盘子直接从 %c 柱子移动到 %c 柱子\n",n,A,C);else{hannuota(n-1,A,C,B);printf("将编号为 %d 的盘子直接从 %c 柱子移动到 %c 柱子\n",n,A,C);hannuota(n-1,B,A,C);}
}int main(){hannuota(2,'A','B','C'); return 0;
} 

代码解析:

调用汉诺塔函数,首先我们传入的盘子数是 2 ,定义三根柱子分别为 A、B、C,进入函数后对 n 进行判断,由于 n > 1,所以执行 else 的代码块,递归调用汉诺塔函数,把 n-1 传入,并且 A -> A,B -> C,C -> B。这里三根柱子变了,至于为什么变,我们接着往下分析。

第一次递归的时候由于 2-1=1 所以满足 if 条件,那么就执行 printf 语句,注意了,此时的柱子是变了的 A -> A,B -> C,C -> B 你可以把三根柱子理解为变量,里面保存的值变了。

打印这条语句的时候,由于 A 保存的值是 A,C 保存的值是 B,n == 1,所以打印的结果就是“将编号为 1 的盘子直接从 A 柱子移动到 B 柱子”,这样,else 代码块中的第一条代码就执行完成了,接下来执行第二条代码,用 printf 打印一条信息,注意了,这里的 n,A,B,C 是主函数里传进来的值,也就是说 n = 2 ,A = A,B = B,C = C,所以打印的结果是“将编号为 2 的盘子直接从 A 柱子移动到 C 柱子”,接着调用第三条代码,第二次递归,因为次时的盘子位置如下图所示:

还需要进行移动,把 n-1,A = B,B = A,C = C,传给递归函数,因为 2-1 满足 if 语句,所以直接打印“将编号为 1 的盘子直接从 B 柱子移动到 C 柱子”。至此结束。

上述就是两个盘子的汉诺塔详细的代码实现过程,n 个盘子的实现结果也是和上面一样的分析法,核心代码不需要变

if(n == 1)printf("将编号为 %d 的盘子直接从 %c 柱子移动到 %c 柱子\n",n,A,C);else{hannuota(n-1,A,C,B);printf("将编号为 %d 的盘子直接从 %c 柱子移动到 %c 柱子\n",n,A,C);hannuota(n-1,B,A,C);}

这里给大家说一下,这种递归的题是很抽象的,没必要每种情况都去详细分析,那样太复杂,刚开始学的话容易把自己绕晕,你只需要详细了解两三个盘子的情况下代码是怎么跑的这就够了。大家按照我上面的分析方法自己试着去分析三个盘子的情况,能分析出来证明你理解了,然后就过。

相关文章:

汉诺塔问题代码写法的详细解析

汉诺塔游戏规则&#xff1a; 规则&#xff1a; 汉诺塔问题是一个经典的问题。汉诺塔&#xff08;Hanoi Tower&#xff09;&#xff0c;又称河内塔&#xff0c;源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着…...

Python爬虫入门

什么是爬虫 爬虫就是程序&#xff0c;一个能获取互联网上的资源(文字、图片、音视频)数据的程序。 不用爬⾍&#xff0c; 打开浏览器&#xff0c; 输⼊百度的⽹址&#xff0c;就能在浏览器上看到百度的内容了。那换成爬⾍呢&#xff1f; 道理是⼀样的。只不过&#xff0c;是⽤…...

【数据结构学习笔记】选择排序

【数据结构学习笔记】选择排序 参考电子书&#xff1a;排序算法精讲 算法原理 首先在未排序序列中找到最小&#xff08;大&#xff09;元素&#xff0c;存放到排序序列的起始位置&#xff0c;然后&#xff0c;再从剩余未排序元素中继续寻找最小&#xff08;大&#xff09;元…...

小资金适合做伦敦金的投资吗?

在回答这个问题之前&#xff0c;我们首先需要了解伦敦金是什么。伦敦金&#xff0c;也称为伦敦金市场交易的黄金&#xff0c;是一种国际性的金融交易产品&#xff0c;其价格受全球政治、经济、货币政策、供求关系等多种因素影响&#xff0c;波动性较大。因此&#xff0c;投资伦…...

自动化运维工具 ---------------Ansible

一、Ansible 发展史及功能 作者&#xff1a;Michael DeHaan&#xff08; Cobbler pxe kikstar 与 Func 作者&#xff09;ansible 的名称来自科幻小说《安德的游戏》中跨越时空的即时通信工具&#xff0c;使用它可以在相距数光年的距离&#xff0c;远程实时控制前线的舰队战斗2…...

富格林:有效做单安全盈利方法

富格林悉知&#xff0c;在伦敦金的投资中&#xff0c;是否安全盈利很大一部分因素取决于是否有效做单&#xff0c;投资者在进入市场之后&#xff0c;需要学习了解伦敦金相关规则&#xff0c;学习一定的做单的技巧&#xff0c;这样有利于我们后续做单顺畅盈利。以下总结几点安全…...

二分查找的理解及应用场景。

一、是什么 在计算机科学中&#xff0c;二分查找算法&#xff0c;也称折半搜索算法&#xff0c;是一种在有序数组中查找某一特定元素的搜索算法 想要应用二分查找法&#xff0c;则这一堆数应有如下特性&#xff1a; 存储在数组中有序排序 搜索过程从数组的中间元素开始&…...

共创时代,品牌如何做好UGC营销?

在当下的互联网时代&#xff0c;众多品牌已经逐渐意识到“产品为重”的影响方式已经很难提升转化率&#xff0c;内容才是吸引用户的必胜法宝&#xff0c;然而当代人被海量信息裹挟&#xff0c;人们的注意力成为稀缺资源&#xff0c;在这个环境下&#xff0c;UGC成为品牌的营销方…...

华为三层交换机:ACL的基本实验

实验要求&#xff1a; PC1不允许访问PC3&#xff0c;PC3可以访问PC1 分析问题&#xff1a; PC1不允许访问PC3&#xff0c;问题中含有“目标地址”则我们需要设置目标地址&#xff0c;这样基本ACL是不行的&#xff0c;必须使用高级ACL [sw1]acl ? INTEGER<2000-2999>…...

基于springboot+vue的旅游管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…...

4. git 添加版本标签

要给某一分支的某一提交版本添加标签&#xff08;tag&#xff09;&#xff0c;你首先需要确定该提交版本在分支上的具体哈希值&#xff08;commit hash&#xff09;。 一旦你有了这个哈希值&#xff0c;你就可以像之前描述的那样使用 git tag 命令来创建标签。 以下是如何操作的…...

2024 PhpStorm激活,分享几个PhpStorm激活的方案

文章目录 PhpStorm 公司简介我这边使用PhpStorm的理由PhpStorm 2023.3 最新变化AI Assistant 预览阶段结束 正式版基于 LLM 的代码补全测试代码生成编辑器内代码生成控制台中基于 AI 的错误解释 Pest 更新PHP 8.3 支持#[\Override] 特性新的 json_validate() 函数类型化类常量弃…...

2419. prufer序列(prufer编码,模板题)

活动 - AcWing 本题需要你实现prufer序列与无根树之间的相互转化。 假设本题涉及的无根树共有 n 个节点&#xff0c;编号 1∼n。 为了更加简单明了的描述无根树的结构&#xff0c;我们不妨在输入和输出时将该无根树描述为一个以 n 号节点为根的有根树。 这样就可以设这棵无…...

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Text)

显示一段文本的组件。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 可以包含Span和ImageSpan子组件。 接口 Text(content?: string | Resource, value?: TextOptions) 从API versi…...

开源大数据集群部署(十五)Zookeeper集群部署

作者&#xff1a;櫰木 1、集群规划 主机版本角色系统用户hd1.dtstack.com3.7.1followerzookeeperhd2.dtstack.com3.7.1leaderzookeeperhd3.dtstack.com3.7.1followerzookeeper 2、zookeeper kerberos主体创建 在生产中zk服务端和客户端票据可以设置成不通名称或相同名称&am…...

服务器镜像是什么

镜像即镜像服务器。镜像服务器与主服务器的服务内容都是一样的&#xff0c;只是放在一个不同的地方&#xff0c;分担主服务器的负载量。 可以使用&#xff0c;但不是原版的。在网上内容完全相同而且同步更新的两个或多个服务器&#xff0c;除主服务器外&#xff0c;其余的都被称…...

JWT原理

JWT 介绍 JWT&#xff08;JSON Web Token&#xff09;是一个开放标准&#xff08;RFC 7519&#xff09;&#xff0c;它定义了一种简洁的、自包含的方法用于通信双方之间以 JSON 对象的形式安全地传输信息。这种信息可以被验证和信任&#xff0c;因为它是数字签名的。JWT通常用于…...

操作系统:一款纯正的“管理”软件

目录 前言&#xff1a; 1.操作系统的概念 2.操作系统的结构示意图&#xff1a; 3.什么是接口&#xff1f; 4.什么是驱动程序&#xff1f; 4.什么是系统调用&#xff08;system call&#xff09;&#xff1f; 5.操作系统和操作系统内核的区别 6.设计OS的核心目的 前言&…...

Mac笔记本聚焦SpotLight占用内存太高的 解法

分享一个自创的绝对有效的解决苹果电脑Mac笔记本SpotLight聚焦占用内存过高的方法! 一、背景 / 问题原因 1、Mac的聚焦功能,可以快速打开应用程序,非常方便! But,随着电脑的使用文件等越来越多,就会导致SpotLight聚焦需要更多更多甚至巨多的内存来建立索引,就会导致电脑…...

C++中.h和.hpp文件有什么区别?

在C中&#xff0c;.h和.hpp文件都是用于包含函数声明、类定义、宏定义等内容的头文件&#xff0c;它们的主要区别在于约定和习惯。 历史与来源&#xff1a;.h后缀是C语言头文件的标准后缀&#xff0c;随着C的演变&#xff0c;一些开发者开始使用.hpp后缀来表示C头文件&#xff…...

AlphaFold 3终极指南:掌握Jackhmmer与HMMER提升蛋白质结构预测精度

AlphaFold 3终极指南&#xff1a;掌握Jackhmmer与HMMER提升蛋白质结构预测精度 【免费下载链接】alphafold3 AlphaFold 3 inference pipeline. 项目地址: https://gitcode.com/gh_mirrors/alp/alphafold3 你是否在蛋白质结构预测项目中遇到MSA生成效率低下的瓶颈&#x…...

高性能Windows流媒体服务器部署:5大核心技术与3种实战架构深度解析

高性能Windows流媒体服务器部署&#xff1a;5大核心技术与3种实战架构深度解析 【免费下载链接】srs-windows 项目地址: https://gitcode.com/gh_mirrors/sr/srs-windows 在Windows平台上构建专业级流媒体服务系统&#xff0c;需要综合考虑协议兼容性、性能优化和部署架…...

政企数据安全:危机与出路

随着数字化转型的浪潮席卷全球&#xff0c;公共部门积累的数据量呈爆炸式增长。从公民个人信息到公共服务记录&#xff0c;从财政预算到基础设施管理数据——这些宝贵资源在提升政府治理效率的同时&#xff0c;也悄然成为网络犯罪分子的“新猎物”。当公共数据逐渐成为数字时代…...

Onekey终极指南:如何5分钟快速获取Steam游戏清单的免费神器

Onekey终极指南&#xff1a;如何5分钟快速获取Steam游戏清单的免费神器 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 还在为复杂的Steam游戏清单下载而头疼吗&#xff1f;想要备份游戏资源却不…...

机器学习在射电天文数据分类中的应用:以MIGHTEE巡天SFG/AGN分类为例

1. 项目概述&#xff1a;当机器学习遇见深空射电巡天在射电天文学领域&#xff0c;我们正经历一场数据洪流。以MeerKAT望远镜阵列主导的MIGHTEE巡天项目为例&#xff0c;其在COSMOS天区的一次早期科学数据释放&#xff0c;就在不到1平方度的天区内探测到了超过6000个射电源。传…...

概率论:常见分布的期望与方差、中心极限定理、切比雪夫不等式

目录 一、0、1分布 二、二项分布 三、泊松分布 四、均匀分布​ 五、指数分布 六、正态分布 七、中心极限定理及其应用 &#xff08;1&#xff09;中心极限定理的定义 &#xff08;2&#xff09;使用示例 八、切比雪夫不等式 &#xff08;1&#xff09;切比雪夫不…...

Armv9-A架构解析:SVE/SME与安全增强技术

1. Armv9-A架构演进与核心特性全景Armv9-A架构代表了Arm公司面向未来十年计算需求的设计哲学&#xff0c;其核心在于三个维度的突破&#xff1a;性能、安全与专用计算。作为长期从事Arm架构开发的工程师&#xff0c;我见证了从Armv7到Armv9的技术跃迁。与固定宽度向量指令的NEO…...

sd卡分区了数据还能恢复吗,只需3种方法和视频教学,数据就能神奇地回来!

断开读写通信&#xff01;锁死底层端口&#xff01;你的sd卡在经历重新分区的一瞬间&#xff0c;其物理层面的扇区正在承受最严酷的逻辑改写。这并非介质烧毁&#xff0c;而是系统内核强行切断了旧有簇链的映射关系&#xff0c;将其标定为休克态。此时若任由操作系统自动加载缩…...

SuperCom串口调试工具终极指南:快速解决嵌入式开发中的通信难题

SuperCom串口调试工具终极指南&#xff1a;快速解决嵌入式开发中的通信难题 【免费下载链接】SuperCom SuperCom 是一款串口调试工具 项目地址: https://gitcode.com/gh_mirrors/su/SuperCom 想象一下这样的场景&#xff1a;你正在调试一个嵌入式设备&#xff0c;需要同…...

GetStoreApp核心功能解析:离线部署Microsoft Store应用的5大优势

GetStoreApp核心功能解析&#xff1a;离线部署Microsoft Store应用的5大优势 【免费下载链接】GetStoreApp 离线下载 Microsoft Store 商店应用 项目地址: https://gitcode.com/gh_mirrors/ge/GetStoreApp GetStoreApp是一款专为Windows用户设计的离线下载工具&#xff…...