汉诺塔问题代码写法的详细解析
汉诺塔游戏规则:
规则:
汉诺塔问题是一个经典的问题。汉诺塔(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);}
这里给大家说一下,这种递归的题是很抽象的,没必要每种情况都去详细分析,那样太复杂,刚开始学的话容易把自己绕晕,你只需要详细了解两三个盘子的情况下代码是怎么跑的这就够了。大家按照我上面的分析方法自己试着去分析三个盘子的情况,能分析出来证明你理解了,然后就过。
相关文章:

汉诺塔问题代码写法的详细解析
汉诺塔游戏规则: 规则: 汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着…...

Python爬虫入门
什么是爬虫 爬虫就是程序,一个能获取互联网上的资源(文字、图片、音视频)数据的程序。 不用爬⾍, 打开浏览器, 输⼊百度的⽹址,就能在浏览器上看到百度的内容了。那换成爬⾍呢? 道理是⼀样的。只不过,是⽤…...
【数据结构学习笔记】选择排序
【数据结构学习笔记】选择排序 参考电子书:排序算法精讲 算法原理 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元…...

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

自动化运维工具 ---------------Ansible
一、Ansible 发展史及功能 作者:Michael DeHaan( Cobbler pxe kikstar 与 Func 作者)ansible 的名称来自科幻小说《安德的游戏》中跨越时空的即时通信工具,使用它可以在相距数光年的距离,远程实时控制前线的舰队战斗2…...
富格林:有效做单安全盈利方法
富格林悉知,在伦敦金的投资中,是否安全盈利很大一部分因素取决于是否有效做单,投资者在进入市场之后,需要学习了解伦敦金相关规则,学习一定的做单的技巧,这样有利于我们后续做单顺畅盈利。以下总结几点安全…...

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

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

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

基于springboot+vue的旅游管理系统
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 主要内容:毕业设计(Javaweb项目|小程序|Pyt…...
4. git 添加版本标签
要给某一分支的某一提交版本添加标签(tag),你首先需要确定该提交版本在分支上的具体哈希值(commit hash)。 一旦你有了这个哈希值,你就可以像之前描述的那样使用 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 个节点,编号 1∼n。 为了更加简单明了的描述无根树的结构,我们不妨在输入和输出时将该无根树描述为一个以 n 号节点为根的有根树。 这样就可以设这棵无…...

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Text)
显示一段文本的组件。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 可以包含Span和ImageSpan子组件。 接口 Text(content?: string | Resource, value?: TextOptions) 从API versi…...

开源大数据集群部署(十五)Zookeeper集群部署
作者:櫰木 1、集群规划 主机版本角色系统用户hd1.dtstack.com3.7.1followerzookeeperhd2.dtstack.com3.7.1leaderzookeeperhd3.dtstack.com3.7.1followerzookeeper 2、zookeeper kerberos主体创建 在生产中zk服务端和客户端票据可以设置成不通名称或相同名称&am…...
服务器镜像是什么
镜像即镜像服务器。镜像服务器与主服务器的服务内容都是一样的,只是放在一个不同的地方,分担主服务器的负载量。 可以使用,但不是原版的。在网上内容完全相同而且同步更新的两个或多个服务器,除主服务器外,其余的都被称…...

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

操作系统:一款纯正的“管理”软件
目录 前言: 1.操作系统的概念 2.操作系统的结构示意图: 3.什么是接口? 4.什么是驱动程序? 4.什么是系统调用(system call)? 5.操作系统和操作系统内核的区别 6.设计OS的核心目的 前言&…...
Mac笔记本聚焦SpotLight占用内存太高的 解法
分享一个自创的绝对有效的解决苹果电脑Mac笔记本SpotLight聚焦占用内存过高的方法! 一、背景 / 问题原因 1、Mac的聚焦功能,可以快速打开应用程序,非常方便! But,随着电脑的使用文件等越来越多,就会导致SpotLight聚焦需要更多更多甚至巨多的内存来建立索引,就会导致电脑…...
C++中.h和.hpp文件有什么区别?
在C中,.h和.hpp文件都是用于包含函数声明、类定义、宏定义等内容的头文件,它们的主要区别在于约定和习惯。 历史与来源:.h后缀是C语言头文件的标准后缀,随着C的演变,一些开发者开始使用.hpp后缀来表示C头文件ÿ…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...
绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
iOS 应用的发布流程一直是开发链路中最“苹果味”的环节:强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说,这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发(例如 Flutter、React Na…...