Java 汉诺塔递归算法
我在理解河内塔递归算法时遇到问题:Java 汉诺塔递归算法,java,algorithm,recursion,Java,Algorithm,Recursion,我在理解河内塔递归算法时遇到问题: 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){ Sy
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移动到b,然后从b移动到c。那是两步。然后我们现在可以将磁盘2从a移到b。现在我们可以将磁盘1从c移回b。现在磁盘3在A上,磁盘2和1在A上。现在我们将磁盘1从a移到b,然后再移到c。不,我们需要以正确的顺序获取磁盘3上的磁盘1和2。所以我们通过将磁盘1从B移到A来清除它。这允许我们将磁盘2从B移到C。现在我们通过将磁盘1从A移到B然后移到C来完成,我们就完成了
这是否回答了您的问题?将N个磁盘塔从桩号a移动到桩号C是通过将N-1(除最后一个磁盘外的所有磁盘)塔从a移动到B,然后将第N个磁盘从a移动到C,最后将先前移动到B的塔从B移动到C来实现的。这应在移动具有多个磁盘的塔时适用,在1磁盘塔的情况下,您只需移动它唯一的磁盘。这里的关键概念是理解改变参数的递归调用……是的,但我确实理解磁盘1从a到C,磁盘2从a到B是如何来的,但不知何故,我无法理解磁盘1从C到B是从哪里来的。你能给我解释一下流程吗?我会非常感激的!更改
doowers(nDisks,'A','B','C')代码>到doowers(nDisks,“左”、“右”、“中”)代码>并查看这是否有助于可视化。检查此可视化这里是另一个可视化:我了解整个工作。。。。但是当我尝试递归地分解它时,我得到的是从A到C的磁盘1,从A到B的磁盘2,从B到C的磁盘2,从A到C的磁盘1。不知何故,我无法理解递归函数是如何将磁盘1从C到B的磁盘3,从A到C的磁盘1,从B到A的:(