添加到LISP中的列表末尾

Ber*_*ert 13 lisp append common-lisp

可能重复:
将项目添加到列表末尾的"缺点"是什么?

在看了很多关于lisp的教程并在谷歌搜索高低搜索后,我仍然无法弄清楚如何添加到LISP列表的末尾.

我希望我的功能'a在列表的末尾添加,'(b c d)但我只知道如何在前面添加它.有人可以帮我正确使用缺点添加'a到列表的末尾?这是我的代码.提前致谢.

(defun AddRt (a list)
  (cond
    ((null list)
      0)
    (t
      (princ (cons a (cons (car list) (cdr list))))
    )))


(AddRt 'a '(b c d))
Run Code Online (Sandbox Code Playgroud)

sds*_*sds 17

无论是pushlast或使用nconc:

> (defparameter a (list 1 2 3))
A
> (push 4 (cdr (last a)))
(4)
> a
(1 2 3 4)
> (nconc a (list 5))
(1 2 3 4 5)
> a
(1 2 3 4 5)
Run Code Online (Sandbox Code Playgroud)

注意,这些都是破坏性的 运营商,即它们修改的是对象价值a,而不仅仅是结合a.

这就是为什么,BTW,你永远不应该nconc在引用列表上使用,比如(nconc '(1 2 3) '(4 5 6)).

PS.请注意,添加到列表末尾需要完全 遍历,因此是一个O(length(list))操作.如果您的列表很长,这可能是一个坏主意,所以人们经常使用 push/ nreverse idiom,例如,

(let (range)
  (dotimes (i 10 (nreverse range))
    (push i range)))
==> (0 1 2 3 4 5 6 7 8 9)
Run Code Online (Sandbox Code Playgroud)


小智 6

您可以使用递归函数.另外,你应该避免在里面使用princ.

以下函数endconscons完全相同,只是在最后添加了值.

(defun endcons (a v)
   (if (null v) (cons a nil) (cons (car v) (endcons a (cdr v)))))

(endcons 'a '(b c d))
Run Code Online (Sandbox Code Playgroud)

当然,你也可以使用append:

(append '(b c d) '(a))
Run Code Online (Sandbox Code Playgroud)

另请参阅此相关问题:将项目添加到列表末尾的"缺点"是什么?