2

我在理解这个汉诺塔递归算法时遇到了问题:

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

有人可以解释一下吗?

谢谢你。

4

2 回答 2

9

将 N-1 个(除最后一个之外的所有磁盘)塔从 A 移动到 B,然后将第 N 个磁盘从 A 移动到 C,最后将之前移动到B,从 B 到 C。这适用于任何时候移动具有多个磁盘的塔,对于 1 个磁盘的塔,您只需移动其唯一的磁盘。

于 2012-12-07T22:41:08.040 回答
0

如果我没记错的话,您可以每转移动 1 个磁盘一个钉子,对吗?因此,您将第一个磁盘从 a 移动到 b,然后将 b 移动到 c。也就是2个动作。然后我们现在可以将磁盘 2 从 a 移动到 b。现在我们可以将磁盘 1 从 c 移回 b。现在磁盘 3 在 A 上,磁盘 2 和 1 在 a 上。现在我们将磁盘 1 从 a 移动到 b,然后再移动到 c。不,我们需要以正确的顺序在磁盘 3 上获取磁盘 1 和 2。因此,我们通过将磁盘 1 从 B 移动到 A 来清除磁盘 1。这允许我们将磁盘 2 从 B 移动到 C。现在我们将磁盘 1 从 a 移动到 b,然后移动到 c,这样就完成了。

这是否回答你的问题?

于 2012-09-18T19:39:23.647 回答