我想知道如何编写一个函数:'a list*int -> 'a list*list
将给定列表转换为具有给定最大长度的列表列表。
例如:segments( [1;2;3;4;5;6;7;8;9], 2 ) => [ [1;2]; [3;4]; [5;6]; [7;8]; [9]
最佳答案
这是一个尾递归解决方案:
let segments xs n =
let rec loop n xs (count, elem) acc =
match xs with
| x::xs' when count < n -> loop n xs' (count+1, x::elem) acc
| x::xs' -> loop n xs' (1, [x]) ((List.rev elem)::acc)
| [] -> List.rev ((List.rev elem)::acc) in
loop n xs (0, []) []
这个想法是保留一个累加器用于创建当前段,另一个累加器用于存储段列表。
关于OCaml中具有特定长度的列表的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9795545/