如何在 OCaml 中交错 3 个列表

Posted

技术标签:

【中文标题】如何在 OCaml 中交错 3 个列表【英文标题】:How to interleave 3 lists in OCaml 【发布时间】:2018-04-10 20:54:27 【问题描述】:

我正在尝试获取三个字符串列表,并让代码返回一个交错三个字符串的列表。如果列表的大小不相等,则使用“-”表示缺少值。

例如:

interleave3 ["1"; "2"; "3"] ["4"] ["5"; "6"]

应该返回:

["1"; "4"; "5"; "2"; "-"; "6"; "3"; "-"; "-"]

【问题讨论】:

我建议您在看的教程中更加灵活 :-) 几乎所有解释如何编写简单递归函数的教程都适用于您的问题。编写完一些代码后,您可以带着更具体的问题回到 ***。 【参考方案1】:

我建议尝试使用两个列表,然后再选择 3 个或更多列表。一旦您了解了两个的模式,您就可以将相同的概念扩展到更多列表。我已经写了一个快速的解决方案,但我并不声称它是惯用的 OCaml。 OCaml 中的列表也以分号分隔。

let rec patternMatching xs ys zs = 
        match xs, ys, zs with
        | [], [], [] -> []
        | x::xs, [], [] -> x :: "-" :: "-" :: patternMatching xs [] []
        | [], y::ys, [] -> "-" :: y :: "-" :: patternMatching [] ys []
        | [], [], z::zs -> "-" :: "-" :: z :: patternMatching [] [] zs
        | x::xs, y::ys, [] -> x :: y :: "-" :: patternMatching xs ys []
        | x::xs, [], z::zs -> x :: "-" :: z :: patternMatching xs [] zs
        | [], y::ys, z::zs -> "-" :: y :: z :: patternMatching [] ys zs
        | x::xs, y::ys, z::zs -> x :: y :: z :: patternMatching xs ys zs



       # patternMatching  ["1"; "2"; "3"] ["4"] ["5"; "6"];;
- : string list = ["1"; "4"; "5"; "2"; "-"; "6"; "3"; "-"; "-"]                    

【讨论】:

【参考方案2】:

如果任务只是交错元素直到所有列表都为空,那将相当简单;只需旋转列表,同时一次添加一个元素,直到它们全部为空。

let rec interleave3 xs ys zs =
  match xs, ys, zs with
  | [], [], [] -> []
  | [], ys, zs -> "-" :: interleave3 ys zs []
  | x::xs, ys, zs -> x :: interleave3 ys zs xs

但是,由于要求每个列表都应该被有效地填充到相等的长度,我们需要以某种方式跟踪最长列表的长度,并继续填充结果列表,直到整个列表都被填充出来。这样做的一种方法是保持总计数,并在我们完成后继续进行,直到总数可以被 3 整除,此时我们知道结果列表具有相同数量的元素:

let interleave3 xs ys zs =
  let rec aux xs ys zs n =
    match xs, ys, zs with
    | [], [], [] when n mod 3 = 0 -> []
    | [], [], []    -> "-" :: aux [] [] [] (n+1)
    | [], ys, zs    -> "-" :: aux ys zs [] (n+1)
    | x::xs, ys, zs ->   x :: aux ys zs xs (n+1)
  in aux xs ys zs 0

【讨论】:

以上是关于如何在 OCaml 中交错 3 个列表的主要内容,如果未能解决你的问题,请参考以下文章

Prolog 如何通过交错将列表列表构造成单个列表?

交错4个相同长度的python列表[重复]

如何使用 OCaml 将两个列表中的每个单独元素压缩到一个列表中

如何在ocaml中将字符串转换为整数列表?

如何在 Ocaml 中解决这个字典问题?

在 Haskell 中交错列表列表