F#寻找Powerset

时间:2013-05-29 22:50:18

标签: recursion f#

我想找到 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]]; []]

1 个答案:

答案 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一样。)