OCaml:两组中每个值的排列?(如何从Java翻译)

Nic*_*ner 4 java ocaml permutation

我有两套,由Set.Make(t)返回.我想生成两者中值的所有可能组合.我怎样才能做到这一点?

这可以生成一些对,但不是全部:

List.combine (IntSet.elements odp) (IntSet.elements ftw)
Run Code Online (Sandbox Code Playgroud)

这将在Java中实现:

for (int i : ktr) {
     for (int m : mnx) {
       System.out.println(i + ", " + m);
     }
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*way 6

将@David Crawshaw的解决方案(尾递归)与@ newacct(完全通用)相结合:

let cartesian_product xs ys =
  List.fold_left (fun acc x -> 
    List.fold_left (fun acc y -> 
      (x,y) :: acc) 
      acc ys) 
    [] xs

let product = 
  cartesian_product (IntSet.elements odb) (IntSet.elements ftw)
Run Code Online (Sandbox Code Playgroud)

这将颠倒自然顺序.它可以通过应用List.rev结果(List.rev也是尾递归)重新获得.


new*_*cct 5

如果xsys是两个列表,则它们的笛卡尔乘积(返回对列表)可以计算如下:

List.concat (List.map (fun x -> List.map (fun y -> (x, y))
                                         ys)
                      xs)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,你xsys现在IntSet.elements odpIntSet.elements ftw