我被要求编写一个递归函数,该函数以下列完全顺序返回集合中的powerset(所有子集的列表):
(powerset '(a b)) -> (() (b) (a) (a b))
(powerset '(a b c )) -> (() (c) (b) (b c) (a) (a c) (a b) (a b c))
我们已经被要求编写一个函数consToAll(A L)
,它将'A
'汇总'到列表L
的每个元素。这是我的consToAll
,它可以正常工作:
(define consToAll
(lambda (A L)
(cond
( (null? L) '() )
( #t (cons (cons A (car L)) (consToAll A (cdr L))) )
)
)
)
这是我最接近的工作powerset
功能:
(define (powerset L)
(cond
( (null? L) '() )
( #t (cons (powerset (cdr L)) (consToAll (car L) (powerset (cdr L)))) )
)
)
输出:
(powerset '(a b)) -> ((()) (a))
(powerset '(a b c)) -> (((()) (b)) (a ()) (a b))
修改
我们还给出了以下提示:
“请注意(powerset'(b))是'(((b))。另请注意(powerset'(ab))由(powerset'(b))附加到(powerset'( b))'a consed into every elements。'
编辑2
我在Python中找到了以下解决方案,它似乎正在做我想做的事情。但是,我无法将最后一行翻译成Lisp:
def powerset(seq):
if not seq:
return [[]]
ps = powerset(seq[1:])
return ps + [[seq[0]] + n for n in ps]