首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >懒散地生成powerset

懒散地生成powerset
EN

Stack Overflow用户
提问于 2011-11-17 08:51:43
回答 3查看 983关注 0票数 4

我想计算一组的powerset。因为我一次不需要整个powerset,所以最好是懒洋洋地生成它。

例如:

代码语言:javascript
复制
powerset (set ["a"; "b"; "c"]) =
seq {
  set [];
  set ["a"];
  set ["b"];
  set ["c"];
  set ["a"; "b"];
  set ["a"; "c"];
  set ["b"; "c"];
  set ["a";"b"; "c"];
}

由于结果是一个序列,我更喜欢按照上面的顺序。我怎样才能在F#中以一种虚无缥缈的方式去做呢?

编辑:

这是我将要使用的(基于BLUEPIXY的答案):

代码语言:javascript
复制
let powerset s =
    let rec loop n l =
        seq {
              match n, l with
              | 0, _  -> yield []
              | _, [] -> ()
              | n, x::xs -> yield! Seq.map (fun l -> x::l) (loop (n-1) xs)
                            yield! loop n xs
        }   
    let xs = s |> Set.toList     
    seq {
        for i = 0 to List.length xs do
            for x in loop i xs -> set x
    }

感谢大家的出色投入。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-17 09:26:18

代码语言:javascript
复制
let rec comb n l =
  match n, l with
  | 0, _  -> [[]]
  | _, [] -> []
  | n, x::xs -> List.map (fun l -> x ::l) (comb (n - 1) xs) @ (comb n xs)

let powerset xs = seq {
    for i = 0 to List.length xs do
      for x in comb i xs -> set x
  }

演示

代码语言:javascript
复制
> powerset ["a";"b";"c"] |> Seq.iter (printfn "%A");;
set []
set ["a"]
set ["b"]
set ["c"]
set ["a"; "b"]
set ["a"; "c"]
set ["b"; "c"]
set ["a"; "b"; "c"]
val it : unit = ()
票数 8
EN

Stack Overflow用户

发布于 2011-11-17 14:15:06

来自,稍微修改为懒惰

代码语言:javascript
复制
let rec powerset s = 
  seq {
    match s with
    | [] -> yield []
    | h::t -> for x in powerset t do yield! [x; h::x]
  }
票数 4
EN

Stack Overflow用户

发布于 2011-11-17 13:11:48

下面是另一种方法,使用数学而不是递归:

代码语言:javascript
复制
let powerset st =
    let lst = Set.toList st     
    seq [0..(lst.Length |> pown 2)-1] 
        |> Seq.map (fun i -> 
            set ([0..lst.Length-1] |> Seq.choose (fun x -> 
                if i &&& (pown 2 x) = 0 then None else Some lst.[x])))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8164364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档