0

我正在尝试使用 Common Lisp 递归地实现河内塔。我知道递归调用是什么以及它们是如何工作的,但是我只是迷失了如何将某些东西从一个列表的末尾移动到另一个列表的末尾。我试图对如何做到这一点进行一些研究,但我在网上找不到任何东西。

任何帮助将不胜感激。

谢谢!

4

1 回答 1

2

您可以使用butlast删除列表的最后一个元素,使用last获取最后一个元素,然后使用append将列表附加到另一个列表(您只需将要添加的元素添加为一个元素列表)。在 CL 中处理列表的末尾并不是最优的,因为每个函数都需要遍历列表才能找到最后一个,但是当您需要在两端添加/删除时就完成了。

使用河内塔,您可以将磁盘堆叠在一起,最后一个放出来的就是第一个放出来的。在 Common Lisp(实际上是任何 Lisp 表亲)中,您可以在递归调用中轻松添加到前面并从前面删除,以在(cdr pole-a)递归调用中删除顶部元素pole-a并添加到。pole-b(cons (car pole-a) pole-b)

我想你需要这个才能真正看到每个阶段中移动了哪个磁盘,因为你不需要这样的结构来计算所需的移动。在这种情况下,您只需要极点的名称和递归级别以及您要在这一轮中移动的磁盘数量。

于 2013-11-09T19:53:22.857 回答