使用递归的List子集

时间:2013-10-17 00:23:37

标签: list recursion scheme racket

我需要编写一个函数来生成给定列表的所有可能子集。我相信我应该使用地图,但我正在努力想出迭代的正确语法。我是否必须在任何地方插入lambda语句?

(list 1 2 3)的所有可能子集应为:

(list (list) 
      (list 1) (list 2) (list 3) 
      (list 1 2) (list 2 3) (list 1 3) 
      (list 1 2 3)))

2 个答案:

答案 0 :(得分:0)

考虑通过包括或不包括每个项目来生成powerset。基本情况是,如果您没有项目,在这种情况下,权力集是一个空集的集合。伪代码将是:

Powerset([]) = [[]]
Powerset(first:rest) = 
    let subPowersets = Powerset(rest) in
        [subPowerset for subPowerset in subPowersets] ++
        [first:subPowerset for subPowerset in subPowersets]

答案 1 :(得分:0)

您也可以尝试:

(define power-set 
 (lambda (set)
   (if (empty? set) '()
        (remove-duplicates (append* (power-set (car set))
                                          (map (lambda (x) (cons (car A) x)) (power-set (cdr A))))))))

虽然我将此代码用于其他函数,例如(set-union)而不是(remove-duplicates(append * ...))另外,我将它们与其他函数的基数相对应。

您可以通过阅读其数学定义来构建这些简单程序。 您可以通过阅读文档来改进它们(一些数学定义会导致'错误'递归,您可以尝试使用tail-recursion