汉诺塔递归图解 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);
}
}
}
这个递归的精髓再于我们在方法体里给它传的实参【传入柱子的顺序】注意观察。
递归,第一部毋庸置疑是递
当 count = 1
时将 A柱
上的第一个小方块移动到 c
。
并返回调用位置
前面说过,每调用一个方法 JVM
就会开辟一个临时栈,当方法结束,JVM
会将这个栈进行回收,也就是销毁。
返回调用位置后继续运行后面的代码
发现调用了一个方法,JVM
开辟临时栈,然后执行调用的方法,count = 1
执行if
语句块里的代码
发现后面没有可执行的代码,则返回调用位置
销毁临时栈
返回调用位置后,发现后面无可执行的代码后,继续返回调用位置
销毁临时栈
返回调用位置后继续执行下面的代码
发现调用了一个方法,开辟一个新的临时栈【因为递的过程比较简单,所以我把两步画在一张图上了】
一直“递”直到count = 1
执行 if
语句块里的代码
执行完后发现后续没有可执行的代码,返回调用位置
销毁空间
返回调用位置后,继续执行后面的代码
发现又调用了一个方法,继续开辟一个临时栈
发现 count = 1
执行 if
语句块里的代码
发现后面无,可执行的代码,返回调用位置
返回调用位置后,销毁临时栈
发现后面没有可执行的代码,返回调用位置
返回调用位置后,销毁临时栈
继续执行后面的代码;
发现后面没有可执行的代码;
返回调用位置;
发现调用位置后面也没有可以执行的代码,退出主程序。
还是那句话,这段代码的精髓就在于 传参。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具