无法理解我的讲师递归算法的河内塔

时间:2011-04-11 18:46:53

标签: recursion towers-of-hanoi

算法如下:

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行在做什么似乎对整个功能起着关键作用。

1 个答案:

答案 0 :(得分:5)

递归算法分为三个步骤:

  1. 将所有光盘移至“备用”挂钩
  2. 将最后一张光盘移至目标钉
  3. 将所有光盘从备用挂钩移动到目标挂钩
  4. ,但将其中一个(步骤1中的那些)移动到目标挂钩

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

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

    这里的要点是,步骤1和3将递归到对move的更多调用,并且每次调用movek > 0只打印一个{{1}的指令行}}。因此,该算法将打印出您需要采取的逐步移动光盘的步骤。

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