对于要实现汉诺塔递归程序的同学,我相信有一部分同学还没有真正的玩过汉诺塔这个游戏,我建议先在手机应用商店下载一个汉诺塔游戏去感受一下,当了解了游戏的玩法之后,也更方便你去理解递归代码的逻辑。

下面通过标准汉诺塔简单介绍一下这个游戏和玩法:

有三个柱子,初始情况是在其中一个柱子上叠有 N 个碟子,碟子从下往上依次变小,在规定大碟子不能在比自己小的盘子的上方的情况下,将所有盘子从初始状态所在的柱子上移到另外一个柱子上,且规定移动过程中一次只能移动一个碟子。


起始柱:当前汉诺塔问题初始状态时所有碟子所在的柱子。

目标柱:玩家想将所有碟子移动至此柱。

中介柱:除了起始柱和目标柱的另外一个柱子,在解决问题的过程中往往作为中转柱。


就是说,从这样( N = 3 时):

变成这样:

此时的问题就是:将三层汉诺塔从起始柱 A 移动到目标柱 C。

想将三层碟子从起始柱 A 移到目标柱 C ,肯定得经过红碟子从起始柱 A 移到目标柱 C 这个步骤,为了不违反规定只能将红盘子子上面的第一二层移动到中介柱 B ,才能保证红碟子的道路畅通,然后红碟子才能从起始柱 A 移到目标柱 C ,所以此时就有了第二个问题:将第一二层碟子移动到 B 来给第三层碟子让路(注意 :第一个问题的中介柱 B 发挥了他的中转作用变成了第二个问题的目标柱 B)。第二个问题解决之后红碟子的路就通了,将红碟子移动到 C, 再将 B 柱的两层碟子移动到 C,问题就解决了(三层碟子从 A柱 移动到 C柱)。

很明显要想完成第二个问题,肯定得经过第二层绿碟子从起始柱 A 移到此时的目标柱 B这个步骤,在不违反规定的情况下只能将绿碟子上面的第一层移动到此时的中介柱 C ,才能保证绿碟子的道路畅通,所以此时就有了第三个问题:将第一层碟子移动到 C 来给第二层碟子让路(注意 :第二个问题的中介柱 C 发挥了中转作用变成了第三个问题的目标柱 C )。第三个问题解决之后绿碟子路就通了,将绿碟子移动到 B ,再将 C 柱的蓝碟子移动到 B,第二个问题就解决了。

很明显要想完成第三个问题,因为第一层蓝碟子上面没有碟子,直接将蓝碟子移动到第三个问题的目标柱 C ,第三个问题就解决了。
然后就有了:

完成第三个问题:

这样就能解决第二个问题:

这样就能解决这个第一个问题:

然后这个问题就解决了。。。。

将过程抽象的看,想要解决 将 N 层汉诺塔从起始柱移动到目标柱需要三个步骤:

  1. 将 N - 1层 塔从起始柱 A 移动到中介柱 B 来为第 N 层 让路。
  2. 第 N 层 路通,移动到目标柱 C。
  3. 将中介柱 B 上的 N - 1层 塔移动到目标柱 C。

就是根据这三步来完成我们的递归程序,当然有的同学会很懵,会想 N -1层 上面还有很多层啊,移动 N -1层 的过程中要移动 第(N - 1) 层 上面的 N - 2层,想要移动 N - 2 层的过程可能会移动 第(N - 2)层 上面的 N - 3层。。。。。。

没错,是要解决这些,且这些都在第一个步骤就能解决,移动 N -1层 的过程中会要移动 第(N - 1) 层 上面的 N - 2层 这个问题 就可以看做是“一个层数为 N - 1,目标柱为 B 中介柱为 C 的新汉诺塔问题”,在第一个步骤继续调用解决汉诺塔问题函数,就这样递归。。。。直到调到 移动层数 为 N = 1的汉诺塔时,他就会返回上一级 继续 第二个步骤,第三个步骤;返回上一级 继续第二个步骤,第三个步骤;返回上一级 继续第二个步骤,第三个步骤。。。。。只不过每层递归的第三个步骤也是可以看做是一个新汉诺塔 问题:将中介柱上的 N - 1层 移动到目标柱 ,继续调用解决汉诺塔问题函数即可。

说了这么多,现在上代码,大家再配合代码理解一下:

 //不管程序走到哪里,盘子都是从 // 当前起始柱 移动向 目标柱public static  void move(String start, String target){System.out.println(start + " -> " + target);}public static void hanoi(int N, String start, String intermediary, String target) {if(N == 1) {//让盘子从当前递归问题的 起始柱 移动到 目标柱move(start,target);}else {//若存在 N-1 层,则为了给第N层一路通畅去目标塔,//将 N-1 层 移动到中介柱//上个递归的目标柱在这一层递归为非目标柱就成了中介柱hanoi(N - 1, start, target, intermediary);//让盘子从当前递归问题的 起始柱 移动到 目标柱move(start,target);hanoi(N - 1, intermediary,start,target);}}

试运行:

public static void main(String[] args) {hanoi(3,"A","B","C");}

运行结果:

每个柱子上的第一个盘子按照结果的顺序依次移动就解决了。

汉诺塔递归实现就介绍到这里,虽然理解的不够深刻,但是希望能给看官一点思路,哪里有问题的话请告诉我。

汉诺塔的递归实现,看完就懂了相关推荐

  1. 数据结构与算法—递归算法(从阶乘、斐波那契到汉诺塔的递归图解)

    目录 递归介绍 递归求阶乘 递归求斐波那契 递归解决汉诺塔 总结 递归介绍 递归:就是函数自己调用自己. 子问题须与原始问题为同样的事,或者更为简单: 递归通常可以简单的处理子问题,但是不一定是最好的 ...

  2. 汉诺塔的递归逐步详解

    文章目录 汉诺塔介绍 递归代码实现 以三个盘子为例逐步详解 汉诺塔介绍 如上图,有三根柱子A,B,C,在A柱子上有N个盘子(图上只画了三个),利用这三根柱子和N个盘子进行汉诺塔游戏,需要最终将A柱子上 ...

  3. 汉诺塔问题 [递归 + 抽象]

    汉诺塔 前言 一.题意 二.抽象思维 1.源码 三.扩展 1.分析 2.源码 总结 参考文献 前言 汉诺塔问题,是学习递归的第一个算法题,也是非常经典的递归问题.由于它是双递归问题,所以初学时不易理解 ...

  4. 汉诺塔——经典递归问题(c语言实现)

    汉诺塔--经典递归问题(c语言实现) 问题背景 汉诺塔问题是一个经典的问题.汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下 ...

  5. 【恋上数据结构】递归(函数调用过程、斐波那契数列、上楼梯、汉诺塔、递归转非递归、尾调用)

    递归(Recursion) 什么是递归? 函数的调用过程(栈空间) 函数的递归调用过程 递归实例分析(1 + 2 + 3 + ... + 100 的和) 递归的基本思想.使用套路 斐波那契数列 fib ...

  6. 从汉诺塔讲递归的思考方式

    想象你来到某个热带丛林,意外发现了十层之高的汉诺塔.正当你苦苦思索如何搬动它时,林中出来一个土著,毛遂自荐要帮你搬塔.他名叫二傻,戴着一个草帽,草帽上有一个2字,号称会把一到二号盘搬到任意柱. 你灵机 ...

  7. labview求n阶乘的和_递归算法(从阶乘、斐波那契到汉诺塔的递归图解)

    递归介绍 递归:就是函数自己调用自己. 子问题须与原始问题为同样的事,或者更为简单: 递归通常可以简单的处理子问题,但是不一定是最好的. 对于递归要分清以下概念: 自己调用自己 递归通常不在意具体操作 ...

  8. python面向过程实践汉诺塔_递归汉诺塔-和递归汉诺塔相关的内容-阿里云开发者社区...

    多柱汉诺塔最优算法设计探究 多柱汉诺塔最优算法设计探究 引言 汉诺塔算法一直是算法设计科目的最具代表性的研究问题,本文关注于如何设计多柱汉诺塔最优算法的探究.最简单的汉诺塔是三个柱子(A.B.C),因 ...

  9. 汉诺塔问题递归算法python代码_[python]汉诺塔问题递归实现

    一.问题描述及算法步骤 汉诺塔问题的大意是有三根柱子a, b, c,现在a柱有N个盘子从下往上尺寸递减排列,要求: 1. 将a上的盘子移动到c柱上; 2. 每次移动一个盘子; 3. 柱子上的盘子始终必 ...

最新文章

  1. 亚洲游戏行业遭遇史上最大DDoS攻击,微软:我给扛下来了
  2. MySQL笔记4:desc命令的两个用法
  3. JDK注解(内置和自定义)
  4. 从编解码、传输到基础架构 详解Bigo多媒体技术栈
  5. 自定义spring boot的自动配置
  6. 微信小程序使用template模板
  7. SQL Server 2000 JDBC驱动的完整安装及测试说明
  8. LeetCode 1824. 最少侧跳次数(DP)
  9. beyond compare类似软件_你用过最好用的截图软件是哪一款
  10. thinkphp5--文章发布后台管理系统
  11. echrts多条折线
  12. 人工智能知识全面讲解: RBF神经网络
  13. 网络工程师(中级)知识点记录
  14. IT时代,不懂编程,到底能不能学前端 ,自己做网站
  15. linux学习笔记——创建软连接
  16. 除了经典怀旧服,还有什么能重新激活《魔兽世界》
  17. 华为设备配置小型园区网
  18. 特解的一万种考虑方法
  19. 大数据安全的重要性解读
  20. 计算机组装前工具的准备,计算机组装 必备工具

热门文章

  1. Hibernate 多表关联
  2. oracle的错误代码如何查看对应的错误信息
  3. ASP+XML+JavaScript实现动态无限级联动菜单
  4. node soket.io + express + vue-soket.io 之间实现通信
  5. go 数组任意位置插入数字类型的元素
  6. JS-对象-构造函数-实例化-this
  7. JNI开发笔记(一)--Android Studio安装与环境搭建
  8. tomcat启动Configuration Error: deployment source ‘xxx:war exploded‘ is not valid
  9. JavaWeb项目实战(2)安装JDK和Tomcat以及Eclipse构造开发环境
  10. MultipartFile和CommonsMultipartFile的区别!