В Лиспе, как вы добавляете данный элемент к каждому списку внутри данного списка?
Вот что у меня так далеко:
(defun append-all(x L)
(if (null L)
L
(cons (append (car L) x) (append-all x (cdr L))))
)
)
Выход:
(append-all '3 '((1) (2 1) (2)))
((1 . 3) (2 1 . 3) (2 . 3))
Хочу:
((1 3) (2 1 3) (2 3))
Это вспомогательная функция, поэтому тот факт, что это связанный список, кажется, вызывает у меня проблемы.
Спасибо
редактировать: исправлен рекурсивный вызов
4 ответа
Решение
В вашем коде измените эту часть:
(append (car L) x)
К этому:
(append (car L) (list x))
Это не работало раньше, потому что append
должен получить два списка в качестве параметров, а не список и элемент.
(defun append-all (item list)
"Appends ITEM to each sublist of LIST"
(flet ((circular-list (item)
(let ((list2 (list item)))
(nconc list2 list2))))
(mapcar #'append
list
(circular-list (list item)))))
Если вы не хотите делать рекурсию самостоятельно, это также должно работать:
(defun append-all (x L)
(mapcar #'(lambda (l) (append l (list x))) L))
Я учусь, но это может сработать.
(defun append-all (x L)
(flet (
(append-item (alist) (append alist (list x))))
(mapcar #'append-item L)))
(print (append-all '3 '((1) (2 1) (2))))