我正在尝试使用 Common Lisp 递归地实现汉诺塔。我知道递归调用是什么以及它们是如何工作的,但我只是不知道如何将某些内容从一个列表的末尾移动到另一个列表的末尾。我正在尝试研究如何执行此操作,但在网上找不到任何内容。
如有任何帮助,我们将不胜感激。
谢谢!
最佳答案
您可以使用 butlast 删除列表的最后一个元素, 用 last 得到最后一个元素, 然后你用 append 将一个列表附加到另一个列表(您只需添加要添加的元素,使其成为一个元素列表)。在 CL 中处理列表的末尾并不是最优的,因为每个函数都需要遍历列表以找到最后一个,但是当您需要在两端添加/删除时就完成了。
在汉诺塔中,您将磁盘堆叠在一起,最后放置的是第一个。在 Common Lisp(实际上是任何 Lisp 表亲)中,您可以通过在递归调用中执行 (cdr pole-a)
轻松地添加到前面和从前面删除,以从 pole- a
并在递归调用中使用 (cons (car pole-a) pole-b)
添加到 pole-b
。
我想你需要这个才能真正看到每个阶段移动了哪个磁盘,因为你不需要这样的结构来计算所需的移动。在这种情况下,您只需要极点的名称和递归级别以及您要在这一轮中移动的磁盘数。
关于lisp - 如何在 Common Lisp 中将元素从一个列表移动到另一个列表 - CLisp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19881765/