我需要编写一个函数来生成给定列表的所有可能子集。我相信我应该使用地图,但我正在努力想出迭代的正确语法。我是否必须在任何地方插入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)))
答案 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)