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

时间:2015-10-08 02:40:45

标签: recursion lisp powerset

我正在尝试编写一个函数,为给定的powerset的每个元素添加一个元素。无论它总是评估什么(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))))) 

1 个答案:

答案 0 :(得分:0)

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

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

在这两种情况下,“添加”表示:获取内容并返回新内容,使用返回的值,否则,如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))))