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