0

我正在尝试创建一个函数,它交错一对三元组,例如 ((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');;

有人可以向我解释如何使用哪些功能来实现适当的交错形式。我还没有了解递归和列表,以防你问我为什么要这样做。已经谢谢你了。

4

2 回答 2

2

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

考虑到您之前建立的元组排序技能,这应该很容易。

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

更新

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

如果您对此进行推理,则相当于从两个元组的前面取最大的值并将其放在输出中。

使用列表更容易做到这一点。

于 2016-10-15T01:08:49.833 回答
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. (请注意,我们不需要 eg 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

使用列表和递归,这会简单得多,因为单个函数可以对任意长度的列表进行操作,因此您不需要相同逻辑的多个不同副本。

于 2016-10-15T02:11:44.740 回答