【发布时间】:2012-09-11 02:46:44
【问题描述】:
我在理解这个汉诺塔递归算法时遇到了问题:
public class MainClass {
public static void main(String[] args) {
int nDisks = 3;
doTowers(nDisks, 'A', 'B', 'C');
}
public static void doTowers(int topN, char from, char inter, char to) {
if (topN == 1){
System.out.println("Disk 1 from " + from + " to " + to);
}else {
doTowers(topN - 1, from, to, inter);
System.out.println("Disk " + topN + " from " + from + " to " + to);
doTowers(topN - 1, inter, from, to);
}
}
}
输出是:
Disk 1 from A to C
Disk 2 from A to B
Disk 1 from C to B
Disk 3 from A to C
Disk 1 from B to A
Disk 2 from B to C
Disk 1 from A to C
我不明白我们如何得到:
Disk 1 from C to B
Disk 3 from A to C
Disk 1 from B to A
谁能解释一下?
谢谢。
【问题讨论】:
-
这里的关键概念是理解递归调用改变参数...
-
是的,但我确实了解从 A 到 C 的磁盘 1 是如何从 A 到 B 的磁盘 2 来的,但不知何故我无法理解从 C 到 B 的磁盘 1 是从哪里来的。你能解释一下流程吗?我真的很感激!
-
将
doTowers(nDisks, 'A', 'B', 'C');更改为doTowers(nDisks, 'Left', 'Right', 'Middle');看看是否有助于将其可视化。 -
这是另一个可视化:jsfiddle.net/9ATNk/1