可能重复:
what is the ‘cons’ to add an item to the end of the list?
在看了很多关于lisp的教程并在google上搜索高低搜索后,我仍然无法弄清楚如何添加到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))
答案 0 :(得分:15)
> (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)
请注意,这些是destructive operators,即他们会修改a
的值对象,而不仅仅是绑定< / {>的a
。
这就是为什么,顺便说一句,你应该永远在引用的列表上使用nconc
,例如(nconc '(1 2 3) '(4 5 6))
。
PS。请注意,添加到列表的 end 需要完整
遍历,因此是O(length(list))
操作。这可能很糟糕
如果你的名单很长,那么人们经常会使用
push
/ nreverse
成语,例如,
(let (range)
(dotimes (i 10 (nreverse range))
(push i range)))
==> (0 1 2 3 4 5 6 7 8 9)
答案 1 :(得分:5)
您可以使用递归函数。另外,你应该避免在里面使用princ。
以下函数 endcons 与 cons 完全相同,只是在最后添加了值。
(defun endcons (a v)
(if (null v) (cons a nil) (cons (car v) (endcons a (cdr v)))))
(endcons 'a '(b c d))
当然,您也可以使用追加:
(append '(b c d) '(a))
另请参阅此相关问题:what is the 'cons' to add an item to the end of the list?
答案 2 :(得分:4)
一种方法是撤销列表。将元素添加到反转列表的开头。然后最后反转整个列表。
计划代码:
(define (add-to-tail l x)
(reverse (cons x (reverse l)))
但如果这是您经常需要的操作,那么我建议您找到除(单个链接)列表之外的数据结构。