Добавление в конец списка в LISP
Возможный дубликат:
что такое "минус" , чтобы добавить элемент в конец списка?
После просмотра многих руководств по lisp и поиска высокого и низкого уровня ответов Google, я до сих пор не могу понять, как добавить в конец списка в LISP.
Я хочу, чтобы моя функция добавила 'a
в конец списка '(b c d)
, но я знаю только, как добавить ее спереди. Может ли кто-нибудь помочь мне правильно использовать cons, чтобы добавить 'a
в конец списка? Вот мой код. Спасибо заранее.
(defun AddRt (a list)
(cond
((null list)
0)
(t
(princ (cons a (cons (car list) (cdr list))))
)))
(AddRt 'a '(b c d))
Ответы
Ответ 1
Либо push
в last
, или используйте 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)
Обратите внимание, что это destructive operator, т.е. они изменяют объект, который является значением a
, а не только привязкой a
.
Вот почему, BTW, вы никогда не должны использовать nconc
в цитированных списках, например (nconc '(1 2 3) '(4 5 6))
.
Ответ 2
Вы можете использовать рекурсивную функцию. Кроме того, вам следует избегать использования принца внутри.
Следующая функция, endcons, делает то же самое, что и минусы, за исключением того, что значение добавляется в конце.
(defun endcons (a v)
(if (null v) (cons a nil) (cons (car v) (endcons a (cdr v)))))
(endcons 'a '(b c d))
Конечно, вы также можете использовать append:
(append '(b c d) '(a))
См. также этот связанный вопрос: что такое 'cons' для добавления элемента в конец списка?
Ответ 3
Один из способов - перевернуть список. Добавьте элемент в начало перевернутого списка. И затем, наконец, измените весь список.
Код схемы:
(define (add-to-tail l x)
(reverse (cons x (reverse l)))
Но если это операция, которую вам нужно часто, то я предлагаю вам найти структуру данных, отличную от (односвязных) списков.