Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 汉诺塔递归算法_Java_Algorithm_Recursion - Fatal编程技术网

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的:(