河内递归算法塔

时间:2012-09-18 19:34:17

标签: 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){
      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

有人可以解释一下吗?

谢谢。

2 个答案:

答案 0 :(得分:9)

将N盘塔从桩A移动到C是通过将N-1(所有盘,但最后一块)塔从A移动到B,然后将第N盘从A移动到C,最后移动塔来实现的。之前移动到B,从B到C.这个应该在移动有多个磁盘的塔的任何时候应用,在1个磁盘塔的情况下,你只需移动它唯一的磁盘。

答案 1 :(得分: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。因此我们通过将磁盘从B移动到A来清除磁盘1.这允许我们将磁盘2从B放到C.现在我们将磁盘1从a移动到b然后再移动到c,我们就完成了。

这会回答你的问题吗?