在Lisp中,如何将给定元素添加到给定列表中的每个列表?

时间:2013-01-22 22:06:01

标签: list functional-programming lisp common-lisp

这是我到目前为止所拥有的:

(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 个答案:

答案 0 :(得分:2)

在您的代码中,更改此部分:

(append (car L) x)

对此:

(append (car L) (list x))

以前没有用,因为append应该收到两个列表作为参数,而不是列表和元素。

答案 1 :(得分:2)

(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)))))

答案 2 :(得分:1)

如果你不想自己做递归,这也应该有效:

(defun append-all (x L)
  (mapcar #'(lambda (l) (append l (list x))) L))

答案 3 :(得分:0)

我正在学习clisp,但它可以工作。

(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))))