如何在OCaml中编写一个函数,返回给定集合中包含k个元素的所有子集?

如何在OCaml中编写一个函数,返回给定集合中包含k个元素的所有子集?,ocaml,Ocaml,问题是: 编写一个函数,返回给定集合中包含k个元素的所有子集 我设法编写了一个代码,从集合中提取所有子集: module Int = struct type t = int let compare = compare end module IS = Set.Make(Int) module IIS = Set.Make(IS) let addelement e ps = IIS.fold (fun s r -> IIS.add (IS.add e s) r) ps ps;; let

问题是:

编写一个函数,返回给定集合中包含k个元素的所有子集

我设法编写了一个代码,从集合中提取所有子集:

module Int = struct
  type t = int
  let compare = compare
end
module IS = Set.Make(Int)
module IIS = Set.Make(IS)
let addelement e ps = IIS.fold (fun s r -> IIS.add (IS.add e s) r) ps ps;;
let powset s = IS.fold addelement s (IIS.singleton IS.empty);;
let set = IS.of_list [1;2;3];;
let r = powset set;;
List.map IS.elements (IIS.elements r);;

现在我要做的唯一一件事就是实现这个条件,这样我们从集合中得到的每个子集都需要有k个元素。如何实现这一点?

您可以在使用
列表获得的最新结果上轻松实现这一点。筛选
,您可以提取具有给定数量元素的元素

 List.filter (fun x -> List.length x = k) (List.map ...);;

好的,我明白了。但是有没有办法直接在函数中实现它呢?。。。嗯,使用is.cardinal和is.filter也有类似的方式。一个方向是powerset函数,该函数将递归计算k个元素的powerset max。。。