用于计算集合的幂集的递归函数

时间:2016-03-10 15:02:45

标签: recursion functional-programming scheme lisp powerset

我被要求编写一个递归函数,该函数以下列完全顺序返回集合中的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]

0 个答案:

没有答案