OCaml中具有特定长度的列表的列表

标签 list ocaml

我想知道如何编写一个函数:'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/

相关文章:

python - 根据分数重新排列列表项以适应函数曲线

functional-programming - 在 OCaml 中实现快速排序 : don't understand what's going wrong?

windows - 使用 CMake 在 MinGW 下的 Windows 上构建 LLVM OCaml 绑定(bind)?

command-line - 动态实例化 OCaml 中的模块

module - OCaml 模块中的抽象类型

emacs - 转到函数定义的简单方法(Emacs,Ocaml)

python - 如何获取列表内嵌套字典的值?

c++ - 从文件读取时如何从行中单独读取每个数字

list - 如何将 Scheme 中的函数应用于另一个函数返回的参数列表?

java - 是否有理由更喜欢 Arrays 而不是 ArrayLists?