我正试图用Common Lisp递归地实现河内之塔。我知道递归调用是什么以及它们是如何工作的,但我只是迷失了我将如何从一个列表的末尾移动到另一个列表的末尾。我试图做一些关于如何做到这一点的研究,但我在网上找不到任何东西。
非常感谢任何帮助。
谢谢!
答案 0 :(得分:2)
您可以使用butlast删除列表的最后一个元素,使用last获取最后一个元素,然后使用append将列表附加到另一个列表中(您只需将元素包含在内)要添加,以便它是一个元素列表)。在CL中的列表末尾处理并不是最佳的,因为每个函数都需要遍历列表才能找到最后一个,但是当你需要在两端添加/删除时,它就完成了。
使用Tower of Hanoi,你将磁盘堆叠在一起,最后一个放在第一个。在Common Lisp(实际上是任何Lisp表兄弟)中,您可以轻松添加到前面并在递归调用中执行(cdr pole-a)
从前面删除以从pole-a
中删除顶部元素并添加到pole-b
在递归调用中使用(cons (car pole-a) pole-b)
。
我想你需要这个才能真正看到每个阶段移动哪个磁盘,因为你不需要这样的结构来计算所需的移动。在这种情况下,您只需要极点的名称和递归的级别以及您想要在此轮次中移动的磁盘数量。