汉诺塔递归图解 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 语句块里的代码

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


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

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

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

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

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

浙公网安备 33010602011771号