Java【汉诺塔问题】详细图文解析, 包教包会

文章目录

  • 前言
  • 一、汉诺塔问题
  • 二、思路分析
  • 三、代码展示
  • 总结


前言

各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你:
JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等
Java数据结构: 顺序表, 链表, 堆, 二叉树, 二叉搜索树, 哈希表等
JavaEE初阶: 多线程, 网络编程, TCP/IP协议, HTTP协议, Tomcat, Servlet, Linux, JVM等(正在持续更新)

汉诺塔,一个为【递归】而生的经典问题,相信很多小伙伴都被汉诺塔问题搞晕过,本篇将详细介绍汉诺塔的实现方式思路解析
如果还有小伙伴对【递归】不太熟练的可以看看这篇文章,有对方法的递归详细介绍噢


提示:是正在努力进步的小菜鸟一只,如有大佬还有更妙的解法欢迎评论区讨论~ 废话不多说,直接上干货!

一、汉诺塔问题

相传在古印度圣庙中,有一种被称为汉诺塔的游戏。该游戏是在一块铜板装置上,有三根杆子:编号 A、 B、 C,在A杆自下而上、由大到小按顺序放置 n 个盘子
游戏的目标:把 A 杆上的金盘全部移到 C 杆上,并仍保持原有顺序叠好
操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于 A、 B、 C任一杆上。


二、思路分析

我从1个盘子开始慢慢给大家演示移动过程:

Java【汉诺塔问题】详细图文解析, 包教包会_第1张图片


下面分析两个盘子:

Java【汉诺塔问题】详细图文解析, 包教包会_第2张图片


下面看三个盘子:

Java【汉诺塔问题】详细图文解析, 包教包会_第3张图片
重点来啦!!
我们先不关心如何移动盘子,只记住:
从 A 开始借助了 C ,将 A 中的 n - 1 个盘子移动到 C ,然后把 A 中盘子移到 C

其实在这里就已经有递归思想的雏形了,但还不够清晰,我们继续


下面看四个盘子:

Java【汉诺塔问题】详细图文解析, 包教包会_第4张图片
Java【汉诺塔问题】详细图文解析, 包教包会_第5张图片

那么递归的思想就是 :
移动 A 中的四个盘子,只需要移动前 n - 1个,
然后 A -> C
再移动 B 中的三个盘子,只需要移动前 n - 1个

注意:我们不去关心每一轮移动具体是如何移动的,交给递归去一次次实现即可

还有几个问题:

Java【汉诺塔问题】详细图文解析, 包教包会_第6张图片

Java【汉诺塔问题】详细图文解析, 包教包会_第7张图片


三、代码展示

Java【汉诺塔问题】详细图文解析, 包教包会_第8张图片
我们以 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 开始慢慢修改代码,代码写对之后再倒推一边!相信你也可以的!!

如果本篇对你有帮助,请点赞收藏支持一下,小手一抖就是对作者莫大的鼓励啦~


上山总比下山辛苦
下篇文章见

Java【汉诺塔问题】详细图文解析, 包教包会_第9张图片

你可能感兴趣的:(Java基础,java,汉诺塔问题,递归)