如何在Lisp中插入元素?

时间:2019-06-02 03:02:38

标签: list lisp

我想在列表的最后一个元素旁边插入一个元素,但是我只知道如何在列表的第一个元素旁边插入一个元素,有人可以进一步帮助我吗? 示例:(插入'5'(1 3 2 7 8 9))应该输出=>(1 3 2 7 8 5 9)

(defun insert (item list)
  (cons (first list)
        (cons item
              (rest list)))) 

//when I do (insert '5 '(1 3 2 7 8 9)) I get (1 5 3 2 7 8 9)

1 个答案:

答案 0 :(得分:4)

列表是单链接列表,因此仅需添加到最前面即可,而不必复制列表的某些部分。您尝试复制第一对,然后将您的对添加为第二个元素,然后使用参数共享原始列表的其余部分。

要添加为最后一个元素,需要这样做直到list为空,然后返回包含一个元素的列表。没有任何缺点是相同的。所以:

(insert 'x '())  ; ==> (list 'x)
(insert 'x '(1)) ; ==> (cons '1 (insert 'x (cdr '(1))))

当然可以使用append完成。懒惰在编程中会得到回报:

(defun insert-last (item list)
  (append list (list item)))

知道,如果您有一个递归函数或一个迭代,其中根据参数为许多元素添加了这样的函数,则您的算法很糟糕。最好在末尾使用loopcollect,或者使列表向后并在最后一步将其反向。然后,您将获得n或2n而不是n ^ 2的数据。