如何在 LISP 中为列表的每个元素添加一个对象?

How can I add an object to each element of a list in LISP?

我正在尝试编写一个函数,为给定幂集的每个元素添加一个元素。无论它总是评估 (null pset) 为真。我不明白为什么。

这是我目前的情况:

(defun addxtopowerset(x pset)
     (cond
        ((null pset) (list x '())) ; If the powerset is null, display x and NIL.
        ;;First display a list combining x and the first item of pset. Then display the first item of pset itself. Then recursively call the function passing the rest of pset as a parameter.
        (T (list 'x (car pset))(list (car pset))
        (addxtopowersetch x (cdr pset))))) 

首先,请注意,在终端情况下,您应该 return 一个空列表,因为在递归中处理了 powerset 的所有元素,我们应该假设 powerset 是 总是一个列表的列表,每个列表代表一个集合(实际上,一个空集的幂集至少包含一个元素,即空集本身)。

因此,由于幂集是一个非空列表,因此向幂集中添加新元素的任务可以通过添加到结果来解决,对于幂集的每个列表,列表和副本添加了元素的列表。

在这两种情况下,“添加”的意思是:得到一些东西 return 一个新东西,使用值 returned,否则,正如 Rainer Joswig 指出的那样,“结果直接进入数字必杀技”。换句话说,在递归情况下,您的函数必须将两个值(列表和添加了元素的新列表)添加到递归调用的结果中。所以,这里是函数:

(defun addxtopowerset(x pset)
   (if (null pset)
       nil
       (append (list (car pset) (cons x (car pset))) 
               (addxtopowerset x (cdr pset)))))

最后,这里有两种定义函数的替代方法,第一种是高阶函数 mapcan:

(defun addxtopowerset(x pset)
  (mapcan (lambda(y) (list y (cons x y))) pset))

第二个 loop:

(defun addxtopowerset(x pset)
  (loop for y in pset append (list y (cons x y))))