【问题标题】:Cannot make sense of my lecturers recursive algorithm for the Towers of Hanoi无法理解我的讲师针对河内塔的递归算法
【发布时间】:2011-08-03 07:34:00
【问题描述】:

算法如下:

Algorithm move(k, from, to, spare)
if k >0 then
move(k−1, from, spare, to)
printf (”move top disc from %d to %d\n”,
from, to)
move(k−1, spare, to, from)

k 是磁盘的数量(http://en.wikipedia.org/wiki/Tower_of_Hanoi)。我理解递归,我只是不明白这是如何工作的,任何人都可以理解这一点吗?

抱歉,我在这里的描述含糊不清,只是我对正在发生的事情的理解也很模糊 - 我不知道 printf 行在做什么,这似乎对整个功能至关重要。

【问题讨论】:

标签: recursion towers-of-hanoi


【解决方案1】:

递归算法分为三个步骤:

  1. 将除一个以外的所有光盘移至“备用”挂钩
  2. 将最后一张光盘移动到目标挂钩
  3. 将除一张以外的所有光盘(步骤 1 中的光盘)从备用挂钩移至目标挂钩

因此,所有光盘都已移动到目标挂钩。

步骤 1 和 3 是伪代码中的两个递归 move(k-1, ...) 调用。第 2 步由 printf 建模。

这里的重点是,步骤 1 和 3 将递归到对 move 的更多调用,并且每次对 move 的调用,k > 0 都会打印出带有 prinft 的指令行。所以将会发生的是,这个算法将打印出你需要采取的步骤来最终详细地移动光盘。

实际上,这个伪代码没有实现移动钉子的算法;这是一种向人类提供指令的算法,如果你愿意的话。

【讨论】:

    猜你喜欢
    • 2012-09-11
    • 2013-11-11
    • 2016-05-25
    • 2011-10-20
    • 1970-01-01
    • 2014-05-31
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多