我想要做的是在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) []
答案 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]; []]
可以对计算列表进行排序和过滤,具体取决于您是否需要结果中的空列表。