我想找到 Powerset
powerset [1; 2; 3] = = [[]; [3]; [2]; [2; 3]; [1]; [1; 3]; [1; 2]; [1; 2; 3]
let rec powerset = function
| [] -> []
| x::xs -> List.map (fun ys -> xs) xs::powerset (xs)
我遇到代码问题,这就是我的输出现在的样子。
val it:int list list list = [[[2; 3]; [2; 3]]; [[3]]; []]
答案 0 :(得分:3)
其他人已经指出使用序列表达式的链接并且懒惰地枚举这些集合。这就是我将如何解决问题(请注意,在序列理解中使用for
没有任何不纯或无功能 - 它只是一种生成结果序列的方法):
let rec powerset s = seq {
match s with
| [] -> yield []
| h::t -> for x in powerset t do yield! [x; h::x] }
也就是说,这可以很容易地转换为返回列表并使用高阶函数的代码:
let rec powerset =
function
| [] -> [[]]
| x::xs -> List.collect (fun subset -> [subset; x::subset]) (powerset xs)
空集的幂集是具有单个元素[]
的集合(请注意,这在您的代码段中是错误的)。为了生成x::xs
的powerset,我们首先生成xs
的powerset,然后为生成的powerset的每个元素返回两个集合 - 一个是子集,另一个是添加了{x
的子集。 1}}元素。 (这是使用List.collect
完成的,就像调用List.map
后跟List.concat
一样。)