【问题标题】:How do I move elements from one list to another in Common Lisp - CLisp如何在 Common Lisp 中将元素从一个列表移动到另一个列表 - CLisp
【发布时间】:2013-11-09 18:56:00
【问题描述】:

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

任何帮助将不胜感激。

谢谢!

【问题讨论】:

  • 在列表末尾添加/删除元素在 Lisp 中不是一个好主意。这是一个缓慢的操作。

标签: lisp common-lisp


【解决方案1】:

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

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

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

【讨论】:

  • 我同意这可能应该使用列表作为堆栈来实现。如果解决方案不是递归的,而是迭代的,您还可以使用(push (pop pole-a) pole-b) 将元素从pole-a 的顶部“移动”到pole-b,同时将pole-apole-b 保留为预期值。
猜你喜欢
  • 2019-03-27
  • 2018-09-03
  • 2011-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-26
  • 1970-01-01
相关资源
最近更新 更多