2014-10-26 38 views
1

我被要求执行递归“汉诺塔”,和我心中的工作这样的逻辑:“汉诺塔”递归不是那么简单,因为它似乎

  1. 移动从开始1个磁盘到缓冲
  2. 从开始从缓冲器移动到其余目标
  3. 移动1个磁盘上目标

每个测试除了通过“Towers_of_hanoi(3,开始,目标)”

原来的正确实施是:

  1. 移动N - 1个磁盘从开始到缓冲区
  2. 移动1从起点到目标
  3. 移动N - 从缓冲区1个磁盘到目标

我已经学会了将递归作为解决问题的一种方法,在我看来,两种实现都是这样做的。我的想法与将其分解的正确方法有什么根本的缺陷?

回答

1

河内塔的事情是,你只能有3个堆栈,你不能把更大的磁盘放在较小的磁盘上,所以你需要确保你使用的栈作为'缓冲区'在进行递归调用之前,不包含任何较小的磁盘。在你的情况下,你将最小的磁盘移动到缓冲区,然后尝试递归移动堆栈的其余部分,但是这会失败,因为缓冲区不可用。

+0

克里斯,我确实看到了这个缺陷,但我觉得奇怪的是,教育工作者并不认为应该提及这些技巧。我所看到的每个视频或演讲都涉及到这个问题,这让我们对该算法有了“刷新”的高层次解释。 那么,如果这种思维方式是递归所必需的,我的算法应该可以正常工作。 (这是一个咆哮:) – user96454 2014-10-26 22:11:56

+0

你的算法确实有效 - 只要它可以将大磁盘放在小磁盘上。如果你通过它,它将整个堆栈移动到缓冲区(倒置的塔),然后移动到目标。 – 2014-10-26 22:14:15

+0

@ user96454作为一个真正教这个并使用Hanoi Towers例子的人,我总是要指出该算法的工作原理是当移动较小的磁盘时,可以忽略较大的磁盘。我很抱歉,任何教这个的人都没有说清楚这一点。 – templatetypedef 2014-10-26 22:15:07

相关问题