В Лиспе, как вы добавляете данный элемент к каждому списку внутри данного списка?

Вот что у меня так далеко:

(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))))
Другие вопросы по тегам