汉诺塔递归图解 Java

汉诺塔递归问题图解

最近学习递归遇到汉诺塔问题,但是光看代码无法理解是怎么解决问题的,因为我懒所以想到网上找找有没有代码运行流程,发现几乎没有,要么就是把代码丢上来然后没了,要么就是把代码丢上来,在加一个汉诺塔的GIF动图,然后没有了。

拜托,我们现在是在学递归解决汉诺塔问题,而不是怎么玩汉诺塔(当然前提是你得会玩汉诺塔)。

所以我自己画了一套。相信大部分人自己能按照代码运行顺序画出运行流程图,但是很浪费时间,为了避免重复造轮子,所以我把我画的图发上来。

因为递归的原因,所以只能把图片尺寸做大,如果看不清,请放大食用。

单击第一张图片,然后点击右上角第二个播放按钮,可以看到动态运行过程

代码:

public class ...... {
    public static void main (String[] args) {
        // 汉诺塔
		HanoiTower tower = new HanoiTower();
		tower.move(3, 'A', 'B', 'C');
    }
}

class HanoiTower {
	public void move (int count, char one, char two, char three) {
		/**
		 * @param one 第一个柱子 起始位置
		 * @param tow 第二个柱子
		 * @param thre 第三个柱子  目标位置
		 * */
		if (count == 1) {
			System.out.println(count + ": " + one + " ==> " + three);
		} else {
			move(count - 1, one, three, two);
			System.out.println(count + ": " + one + " ==> " + three);
			move(count - 1, two, one, three);
		}
	}
}

这个递归的精髓再于我们在方法体里给它传的实参【传入柱子的顺序】注意观察。

递归,第一部毋庸置疑是递

1

count = 1 时将 A柱 上的第一个小方块移动到 c

并返回调用位置

2

前面说过,每调用一个方法 JVM就会开辟一个临时栈,当方法结束,JVM会将这个栈进行回收,也就是销毁。

3

返回调用位置后继续运行后面的代码

4

发现调用了一个方法,JVM开辟临时栈,然后执行调用的方法,count = 1 执行if语句块里的代码

5

发现后面没有可执行的代码,则返回调用位置

6

销毁临时栈

7

返回调用位置后,发现后面无可执行的代码后,继续返回调用位置

8

9

销毁临时栈

10

11

返回调用位置后继续执行下面的代码

发现调用了一个方法,开辟一个新的临时栈【因为递的过程比较简单,所以我把两步画在一张图上了】

一直“递”直到count = 1执行 if语句块里的代码

12

执行完后发现后续没有可执行的代码,返回调用位置

13

销毁空间

14

15

返回调用位置后,继续执行后面的代码

16

发现又调用了一个方法,继续开辟一个临时栈

发现 count = 1 执行 if 语句块里的代码

17

发现后面无,可执行的代码,返回调用位置

18

19

返回调用位置后,销毁临时栈

20

发现后面没有可执行的代码,返回调用位置

21

返回调用位置后,销毁临时栈

22

继续执行后面的代码;

发现后面没有可执行的代码;

返回调用位置;

发现调用位置后面也没有可以执行的代码,退出主程序。

23

还是那句话,这段代码的精髓就在于 传参。

posted @   假文艺青年。  阅读(268)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示