重复ocaml列表中的排列

时间:2018-12-10 22:08:21

标签: ocaml combinations permutation

我有一个函数,可以使从列表的N个元素中选择的K个不同的对象组合在一起,问题不在于重复,例如:

提取2 [“ a”;“ b”;“ c”;“ d”] ;; -:字符串列表列表= [[“一种”; “ b”]; [“一种”; “C”]; [“一种”; “ d”]; [“ b”; “C”]; [“ b”; “ d”]; [“C”; “ d”]]

这是我的代码:

# let rec extract k list =
if k <= 0 then [ [] ]
else match list with
     | [] -> []
     | h :: tl ->
        let with_h = List.map (fun l -> h :: l) (extract (k-1) tl) in
        let without_h = extract k tl in
        with_h @ without_h;;

感谢您的答复,我正在尝试找出解决方法。

1 个答案:

答案 0 :(得分:1)

  

我有一个功能,可以组合K个不同的对象

确实。

  

问题不在于重复,

这并不比组合难得多。归纳步骤有两种方法。如果要置换(非空)集合A的{​​{1}}个元素,可以:

方法1

对于x中的每个元素A,计算k-1的{​​{1}}个元素的排列,并将A\{x}放在所有这些排列的前面。然后加入您为每个x获得的解决方案集。

方法2

x中选择一个x,计算A的{​​{1}}个元素的排列,然后对于找到的每个排列,通过在其中插入k-1来计算新的排列每个可能的位置。