C语言修炼——汉罗塔问题与函数递归
目录一、汉罗塔问题1.介绍2.讲解二、编程中的汉罗塔问题1.代码概览2.详解代码一、汉罗塔问题1.介绍汉诺塔问题是一个经典的问题。汉诺塔Hanoi Tower又称河内塔源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把所有圆盘移到另一根柱子上。并且规定任何时候在小圆盘上都不能放大圆盘且一次只能搬动一个圆盘。问应该如何操作搬动次数最少2.讲解假设我们有A、B、C三根石柱其中A为起始石柱B为中转石柱C为目的石柱。如果A上有一个圆盘我们可以直接将A上圆盘移到C上即A-C共1步如果A上有两个圆盘我们需要借助中转石柱即B石柱先将A上小圆盘移到B上再将A上大圆盘移到C上最后将之前移到B上的小圆盘移到C上即A-B A-C B-C共3步如果A上有三个圆盘我们首先将小圆盘移到C上接着中圆盘移到B后小圆盘再次移到B然后大圆盘移到C接着小圆盘移到A后中圆盘移到C最后小圆盘移到C即A-C A-B C-B A-C B-A B-C A-C共7步。…以此类推最小移动次数总为2^n-1n为圆盘总个数。需注意为取最小移动次数在实际移动时当圆盘总数为偶数时我们将第一个圆盘即最小圆盘先移到B当圆盘总数为奇数时则先移到C。二、编程中的汉罗塔问题现在我们想要编写一个程序输入n值代表起始石柱上圆盘总数然后让程序打印出移动步骤来帮助我们完成搬运工作。1.代码概览#includestdio.hMove(charpos1,charpos3)//打印移动步骤{printf(%c-%c ,pos1,pos3);}Hanio(intn,charpos1,charpos2,charpos3)//pos1起始石柱pos2中转石柱pos3目的石柱{if(n1){Move(pos1,pos3);}else{Hanio(n-1,pos1,pos3,pos2);//交换pos2,pos3Move(pos1,pos3);Hanio(n-1,pos2,pos1,pos3);//交换pos1,pos2}}intmain(){intn0;scanf(%d,n);Hanio(n,A,B,C);return0;}运行结果2.详解代码我们来看看这段代码是如何实现的先来看一张动图以4个圆盘为例上图可以分为三个阶段借pos3将pos1最上面3个圆盘转移到pos2交换pos1、pos3将最大的圆盘从pos1移至pos3借pos1将pos2上3个圆盘移至pos3上。其实到此我们已经说出了这段代码的精髓了。上面我们提到1个圆盘是A-C2个圆盘是A-B | A-C | B-C3个圆盘是A-C A-B C-B | A-C | B-A B-C A-C4个圆盘是A-B A-C B-C A-B C-A C-B A-B | A-C | B-C B-A C-A B-C A-B A-C B-C…易知除了1个圆盘外我们都可以用|划分出这三个阶段。1Hanio(intn,charpos1,charpos2,charpos3)2{3if(n1)4{5Move(pos1,pos3);6}7else8{9Hanio(n-1,pos1,pos3,pos2);10Move(pos1,pos3);11Hanio(n-1,pos2,pos1,pos3);12}13}所以我们构造分支如果n1则直接将圆盘从A搬到C如果n1,则else第9行为第一阶段第10行为第二阶段第11行为第三阶段。以n3为例运行逻辑如下所谓大事化小事这是递归的意义所在可以化繁为简。而图片中的’小事‘就是前文的三个阶段即第一层递归的三个支线其中的两个Hanio支线又可以细分、往复下去。可以发现一开始从外到内Hanio函数一直都是在传递形参即‘递’ 直到n1时才进入‘归’这时这种循环往复从内到外继续进行。再深思这种循环往复归根其实是pos1、pos2、pos3的循环往复。建议大家对着运行逻辑图拿纸笔将每一次交换都按顺序写下来用心领悟试着去分析一下个例搞透了整体思想也就容易理解了最终递归我们也就拿捏了。其实简单地讲递归无非就是一个从外‘递’至内从内‘归’回外的过程我们需要的只是明确递的是什么归的是什么这样就很容易理解汉罗塔问题了。

相关新闻

游戏剧情本地化实战:从编码转换到字幕与字体适配

游戏剧情本地化实战:从编码转换到字幕与字体适配

最近在整理日服活动剧情相关的本地化资料时,发现很多同学第一次接触这类文本,卡得最多的并不是剧情翻译本身,而是“文件打不开”“打开后全是乱码”“中文字体显示成方块”。尤其在面对《Dive into Ocean》这种以活动剧情、角色对话和演出文本…

2026/10/16 9:08:22 阅读更多 →
VRChat密室解谜闯关指南:BACK-SPACE第1/2部完整通关与性能排查

VRChat密室解谜闯关指南:BACK-SPACE第1/2部完整通关与性能排查

这一期,我们来聊 VRChat 里一个比较耐玩的闯关世界:BACK-SPACE 的第 1 部和第 2 部。如果你对 VR 社交、密室解谜、以及和小伙伴一起在虚拟空间里合作通关感兴趣,这篇文章可以直接收藏。它不会跟你讲太多虚的,我会按“进世界前要准…

2026/10/16 9:08:22 阅读更多 →
ArcEngine栅格与矢量渲染原理及协同优化实战

ArcEngine栅格与矢量渲染原理及协同优化实战

1. 这不是“调个颜色”那么简单:ArcEngine栅格与矢量图层渲染的本质矛盾很多人第一次在ArcEngine里点开图层属性,看到“符号系统”选项卡时,下意识觉得:“不就是换个颜色嘛,拖个色块、选个渐变,三分钟搞定。…

2026/10/16 9:08:22 阅读更多 →

最新新闻

LabVIEW波峰波谷检测实战:从Peak Detector到数组遍历及参数调优

LabVIEW波峰波谷检测实战:从Peak Detector到数组遍历及参数调优

最近在调一套气动检测平台的采集程序,甲方要的指标很直接:每次气缸动作,上位机必须自动把压力波形的冲击峰值时刻标出来,漏一个峰都不行。这种需求在LabVIEW的日常项目里太常见了——振动监测要看极值区间,疲劳测试要统…

2026/10/16 10:42:49 阅读更多 →
计算机考研真题背后的系统级思维:从栈共享到TCP握手的底层逻辑

计算机考研真题背后的系统级思维:从栈共享到TCP握手的底层逻辑

简介:本资源为武汉理工大学计算机专业硕士研究生复试真题汇编,面向备考该校计算机学院考研复试的考生,系统覆盖近四年(2004–2007)复试试题及核心知识点解析,直击操作系统、数据结构、计算机网络、数据库原…

2026/10/16 10:42:49 阅读更多 →
Flink Exactly Once与At Least Once落地实战指南

Flink Exactly Once与At Least Once落地实战指南

1. 这不是理论考试,是生产环境里每天要签的“生死状”Flink 的 Exactly Once 和 At Least Once,这两个词在面试题里出现频率高得离谱,但真正让一线开发者头皮发紧的,从来不是背定义,而是某天凌晨三点收到告警&#xff…

2026/10/16 10:42:49 阅读更多 →
NSGA-III 的 MATLAB 实现:参考点引导的多目标优化代码解析

NSGA-III 的 MATLAB 实现:参考点引导的多目标优化代码解析

简介:这是一份可在 MATLAB 中直接运行的 NSGA-III 多目标进化算法代码,面向需要处理多目标优化问题、熟悉遗传算法但希望快速获得可复现基线的研究人员与高年级学生。资源实现了参考点生成、非支配排序、模拟二进制交叉与多项式变异、种群归一化、关联参…

2026/10/16 10:42:49 阅读更多 →
内置修改器1.67版版本匹配与安装排错指南

内置修改器1.67版版本匹配与安装排错指南

简介:GTA5中文内置修改器1.67版本是为GTA5线下单机玩家制作的游戏插件,由3DM-DJ小良汉化,支持2023年10月更新的1.67/3028版游戏,提供简体与繁体两套界面,具备一键刷车、武器获取、传送、保镖雇佣等常用功能&#xff0c…

2026/10/16 10:42:49 阅读更多 →
C#面向对象:Person类、Student类继承与构造函数全解析

C#面向对象:Person类、Student类继承与构造函数全解析

1. 面向对象的第一步:从Person类的设计说起很多人学C#敲的第一段面向对象代码,就是从定义人类Person开始的。这个题目看着简单,但背后其实藏着一堆值得掰扯清楚的细节——构造函数怎么写、字段和属性有什么区别、继承之后构造函数怎么联动。我…

2026/10/16 10:41:46 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →