如何在Common Lisp-CLisp中将元素从一个列表移动到另一个列表

如何在Common Lisp-CLisp中将元素从一个列表移动到另一个列表,lisp,common-lisp,Lisp,Common Lisp,我正试图用公共Lisp递归实现一个河内塔。我知道递归调用是什么以及它们是如何工作的,但我只是不知道如何将某些内容从一个列表的末尾移动到另一个列表的末尾。我试图做一些关于如何做到这一点的研究,但我在网上找不到任何东西 任何帮助都将不胜感激 谢谢 您可以使用删除列表的最后一个元素,使用获取最后一个元素,然后使用cat将列表附加到另一个列表中(您只需将要添加的元素设置为一个元素列表)。在CL中处理列表的末尾不是最优的,因为每个函数都需要遍历列表才能找到最后一个,但是当您需要在两端添加/删除列表时,就可

我正试图用公共Lisp递归实现一个河内塔。我知道递归调用是什么以及它们是如何工作的,但我只是不知道如何将某些内容从一个列表的末尾移动到另一个列表的末尾。我试图做一些关于如何做到这一点的研究,但我在网上找不到任何东西

任何帮助都将不胜感激


谢谢

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

有了河内之塔,你就可以把磁盘叠在一起,最后一个放出来的就是第一个放出来的。在Common Lisp(事实上是任何Lisp近亲)中,您可以在递归调用中通过执行
(cdr pole-a)
轻松地添加到前面和从前面删除,以从
pole-a
中删除顶部元素,并在递归调用中通过
(cons(car pole-a)pole-b)
添加到
pole-b


我想您需要这个来实际查看每个阶段中移动的磁盘,因为您不需要这样的结构来计算所需的移动。在这种情况下,您只需要极点的名称、递归级别以及希望在这一轮中移动的磁盘数。

在Lisp中,在列表末尾添加/删除元素不是一个好主意。这是一个缓慢的操作。我同意应该使用列表作为堆栈来实现这一点。如果解决方案不是递归的,而是迭代的,那么您也可以使用
(push(pop pole-a)pole-b)
将元素从
pole-a
的顶部“移动”到
pole-b
,同时保留
pole-a
pole-b
的预期值。