在OCaml中交错

时间:2016-10-15 00:40:35

标签: ocaml interleave

我正在尝试创建一个交错一对三元组的函数,例如((6,3,2),(4,5,1))并从这个交错中创建一个6元组。 我做了一些研究,但可以理解交错应该如何工作,所以我尝试了自己的一些东西最终得到一个代码,创建一个6元组但不是以正确的交错方式。这是我的代码

let interleave ((a, b, c), (a', b', c')) =
let sort2 (a, b) = if a > b then (a, b) else (b, a) in
let sort3 (a, b, c) = 
let (a, b) = sort2 (a, b) in
let (b, c) = sort2 (b, c) in
let (a, b) = sort2 (a, b) in
(a, b, c) in
let touch ((x), (y)) = 
let (x) = sort3 (x) in
let (y) = sort3 (y) in
((x),(y)) in
let ((a, b, c), (a', b', c')) = touch ((a, b, c), (a', b', c')) in
(a, b', a', b, c, c');;

有人可以向我解释一下我可以通过哪些功能实现正确的交错形式。我还没有学习过递归和列表,以防你为什么要这样做。 谢谢你。

2 个答案:

答案 0 :(得分:2)

问题陈述使用单词“max”而不定义它。如果您使用OCaml的内置compare函数作为定义,则使用lexicographic order。因此,您希望6元组中第一个位置的最大值(6个值),下一个第二个值,依此类推。

鉴于您之前已经建立的元组排序技巧,这应该很容易。

对于它的价值,保留两个3元组的身份似乎没有多大价值。一旦进入最外层函数,您就可以使用6个值作为6元组。或者在我看来。

<强>更新

从你的例子(应该可能在开头给出它:-),你很清楚你被要求做什么。您希望最终得到一个序列,其中原始元组的元素按原始顺序排列,但它们可以任意交错。这通常被称为“shuffle”(或合并)。你必须按字典顺序找到具有最大值的shuffle。

如果你说明这一点,那就等于从两个元组的前面取出最大值,然后将它放在输出中。

更容易处理列表。

答案 1 :(得分:2)

现在我明白了你的最终目标是什么。 。

由于 n 元素的元组是不同 n 的不同类型,因此需要定义辅助函数来操作不同大小的元组。

一种方法,基本上模仿列表上的递归函数(但由于元组都有不同的类型,需要很多额外的函数),有两组辅助函数:

  • 将值添加到现有元组的函数:prepend_to_2,直至prepend_to_5。例如,

    let prepend_to_3 (a, (b, c, d)) = (a, b, c, d)
    
  • 将每个可能大小的两个元组交错为3的函数:interleave_1_1interleave_1_2interleave_1_3interleave_2_2interleave_2_3interleave_3_3。 (请注意,我们不需要例如interleave_2_1,因为我们可以使用相反顺序的参数调用interleave_1_2。)例如,

    let interleave_2_2 ((a, b), (a', b')) =
        if a > a'
        then prepend_to_3 (a, interleave_1_2 (b, (a', b')))
        else prepend_to_3 (a', interleave_1_2 (b', (a, b)))
    

    (你知道它是如何运作的吗?)

然后interleave只是interleave_3_3

使用列表和递归会更加简单,因为单个函数可以在任何长度的列表上运行,因此您不需要同一逻辑的多个不同副本。