生成OCAML中列表的所有子列表

时间:2017-12-05 23:31:27

标签: list ocaml

我想要做的是在OCAML中生成列表的所有子列表,
例如

  

[1; 2; 3]

因此我想得到这个

  

[[1]; [2]; [3]; [1; 2]; [1; 3]; [2 3] [1; 2; 3]]

到目前为止,这是我的方法:

let sublist l = 
let rec aux i j max l2=
match l with 
|[]->l
|h:t-> if(i=max && j=max) then l2 else if (j<max ) then aux i j+1 [h]::tl  else 
       aux i+1 i+1 l
in aux 0 0 (List.length l) []

1 个答案:

答案 0 :(得分:1)

使用分而治之的方法:给定一个非空列表,通过删除其第一个元素x并解决剩余元素的问题(通过递归步骤),可以获得其所有子列表的列表。

当递归调用返回时,您将此中间结果与先前截断的元素x组合在一起:您必须返回每个子列表,并在其前面添加x并且不进行修改。< / p>

let rec sublists = function
  | []    -> [[]]
  | x::xs -> let ls = sublists xs in
               List.map (fun l -> x::l) ls @ ls;;

对于您的示例输入,这计算:

  

#lublists [1; 2; 3] ;;

     

- :int list list = [[1; 2; 3]; [1; 2]; [1; 3]; [1]; [2; 3]; [2]; [3]; []]

可以对计算列表进行排序和过滤,具体取决于您是否需要结果中的空列表。