【问题标题】:Tower of Hanoi Recursion Algorithm河内塔递归算法
【发布时间】: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

标签: java algorithm recursion


【解决方案1】:

如果我没记错的话,你可以每转一圈移动 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,这样就完成了。

这能回答你的问题吗?

【讨论】:

  • 我了解整个工作过程......但是当我试图递归分解它时,我得到的只是磁盘 1 从 A 到 C 磁盘 2 从 A 到 B,磁盘 2 从 B 到 C磁盘 1 从 A 到 C。我不知何故无法理解递归函数如何将磁盘 1 从 C 到 B 磁盘 3 从 A 到 C 磁盘 1 从 B 到 A :(
【解决方案2】:

将 N 个圆盘塔从挂钩 A 移动到 C 是通过将 N-1 个(除最后一个之外的所有圆盘)塔从 A 移动到 B,然后将第 N 个圆盘从 A 移动到 C,最后移动塔来实现的之前移动到 B,从 B 到 C。这适用于任何时候移动具有多个磁盘的塔,如果是 1 个磁盘塔,您只需移动其唯一的磁盘。

【讨论】:

    猜你喜欢
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 2012-09-01
    相关资源
    最近更新 更多