各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你:
📕 JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等
📗 Java数据结构: 顺序表, 链表, 堆, 二叉树, 二叉搜索树, 哈希表等
📘 JavaEE初阶: 多线程, 网络编程, TCP/IP协议, HTTP协议, Tomcat, Servlet, Linux, JVM等(正在持续更新)
汉诺塔,一个为【递归】而生的经典问题,相信很多小伙伴都被汉诺塔问题搞晕过,本篇将详细介绍汉诺塔的实现方式及思路解析
如果还有小伙伴对【递归】不太熟练的可以看看这篇文章,有对方法的递归详细介绍噢
提示:是正在努力进步的小菜鸟一只,如有大佬还有更妙的解法欢迎评论区讨论~ 废话不多说,直接上干货!
相传在古印度圣庙中,有一种被称为汉诺塔的游戏。该游戏是在一块铜板装置上,有三根杆子:编号 A、 B、 C,在A杆自下而上、由大到小按顺序放置 n 个盘子
游戏的目标:把 A 杆上的金盘全部移到 C 杆上,并仍保持原有顺序叠好
操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于 A、 B、 C任一杆上。
我从1个盘子开始慢慢给大家演示移动过程:
下面分析两个盘子:
下面看三个盘子:
重点来啦!!
我们先不关心如何移动盘子,只记住:
从 A 开始借助了 C ,将 A 中的 n - 1 个盘子移动到 C ,然后把 A 中盘子移到 C
其实在这里就已经有递归思想的雏形了,但还不够清晰,我们继续
下面看四个盘子:
那么递归的思想就是 :
移动 A 中的四个盘子,只需要移动前 n - 1个,
然后 A -> C
再移动 B 中的三个盘子,只需要移动前 n - 1个
…
注意:我们不去关心每一轮移动具体是如何移动的,交给递归去一次次实现即可
还有几个问题:
我们以 n = 4 代入代码推演一遍:
0、准备移动
传参顺序:A 是出发站, B 是中转站, C 是目标站(第 31 行)
1、移动 A 上的 n - 1 个盘子,在 C 中转,移动到 B
传参顺序:A 是出发站, C是中转站, B 是目标站(第 16 行)
2、把 A 的盘子移动到 C (第 17 行)
3、接下来移动 B 上的 n - 1 个盘子,在 A 中转,移动到 C
传参顺序: B 是出发站, A 是中转站, C 是目标站(第 18 行)
…
注意:传参的顺序就是进入递归之后,接收参数的顺序 你只管传参,剩下的交给递归
以上就是今天要讲的【汉诺塔问题】,只要各位能把图画明白,沉下心来思考每一 “阶段” 移动方式,寻找 “大事化小且原理相同” 的解决办法,不必考虑细节实现方式,只要找到宏观规律即可。
刚上手的小伙伴可以先画图,从 n = 2 开始慢慢修改代码,代码写对之后再倒推一边!相信你也可以的!!
如果本篇对你有帮助,请点赞收藏支持一下,小手一抖就是对作者莫大的鼓励啦😋😋😋~
上山总比下山辛苦
下篇文章见