【问题标题】:Splitting a list in OCaml在 OCaml 中拆分列表
【发布时间】:2020-04-29 06:19:47
【问题描述】:

我想知道是否可以将列表分成两半(或通常在指定元素处)。

确切地说,我想做这样的事情: 有一个列表(例如整数):

let ml = [1;2;3;4;5]

我想用第一个列表的参数指定长度的两个列表。

看起来像这样:

let msl1, msl2 = split_at_point ml 3
(* msl1 = [1;2;3], msl2=[4;5] *)

老实说,我并不关心分裂是否发生在特定的点上。我所关心的是它会很快并且节省内存(没有复制会很好)。而且我知道,就效率而言,最好的方法是 O(n),其中n 是第一个列表(结果)的长度。

【问题讨论】:

    标签: linked-list ocaml


    【解决方案1】:

    您无法避免复制列表的前半部分。列表是不可变的,因此获取新列表的唯一方法是从原始列表中复制元素。

    列表的后半部分不需要副本,因为列表的尾部是列表。

    没有用于执行此操作的内置函数(无论如何在 OCaml 标准库中),所以我建议您自己编写。

    这看起来很像家庭作业,所以我只想说,用函数式语言编写大多数列表函数的方法是问问自己如何使用一个适用于较小规模的函数输入(通常是列表的尾部)来计算原始输入的值。

    你的情况是这样的:

    let rec split_at_point l n =
        if n = 0 then
            (* Answer is obvious *)
        else
            match l with
            | [] -> (* Answer is obvious *)
            | head :: tail ->
                (* Call split_at_point on the tail and
                 * construct your answer
                 *)
    

    【讨论】:

      猜你喜欢
      • 2012-05-21
      • 2019-05-24
      • 2013-02-25
      • 1970-01-01
      • 1970-01-01
      • 2018-04-07
      • 1970-01-01
      • 2023-04-10
      相关资源
      最近更新 更多