2013-11-09 69 views
0

我试图实现河内的塔递归与Common Lisp的。我知道递归调用是什么以及它们是如何工作的,但是我只是想知道如何将某个列表从一个列表的末尾移动到另一个列表的末尾。我试图做一些研究如何做到这一点,但我无法在网上找到任何东西。如何移动元素从一个列表到另一个Common Lisp中 - CLISP

任何帮助将不胜感激。

谢谢!

+2

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

回答

2

您可以butlast删除列表的最后一个元素,获得最后一个元素与last,和你的猫追加一个列表与append另一个列表(你只是负面因素的元素被添加,以便它的一个元素列表) 。在CL中列表的末尾工作并不是最佳的,因为每个函数都需要遍历列表才能找到最后一个列表,但在需要在两端添加/删除时完成。

随着汉诺塔你在对方最后一个看跌的顶部堆叠盘是第一位的。在Common Lisp中(其实任何Lisp的表弟),你可以轻松地添加到前面,从正面用递归调用做(cdr pole-a)pole-a除去顶部元素,并在递归调用添加到pole-b(cons (car pole-a) pole-b)删除。

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

+0

我同意这可能应该使用列表作为堆栈来实现。如果解不是递归的,而是迭代的,你也可以使用'(push(pop-pole-a)pole-b)'将元素从'pole-a'顶部移动到'pole-b' ,将'pole-a'和'pole-b'留下期望值。 –

相关问题