根据某些规则将两个列表混合到另一个列表中

时间:2014-10-21 14:03:32

标签: list ocaml shuffle

我正在尝试在Ocaml中实现以下程序: 编写一个shuffle : α list → α list → α list过程,该过程将返回一个列表,其中包含根据以下规则洗牌的2个列表中的元素:

  • 来自2个输入列表的所有列表都在输出列表
  • 上 两个列表中的
  • 元素与之前的顺序相同
  • 输入列表中至少一个输入列表的元素不是彼此相邻

shuffle [5; 7; 0; 5] [3; 2; 8; 9; 3]的示例输出:

  • [5; 3; 2; 7; 8; 9; 0; 3; 5]
  • [3; 5; 2; 7; 8; 0; 9; 5; 3]

我知道如何实现一个简单的shuffle函数(取自here):

let shuffle d =
    let nd = List.map (fun c -> (Random.bits (), c)) d in
    let sond = List.sort compare nd in
    List.map snd sond

你能否告诉我如何从那里出发?

1 个答案:

答案 0 :(得分:1)

这是一个符合前两个要求的简单随机散布:

let shuffle a b =
  let rec loop a b = match a, b with
     | [], r
     | r, [] -> r
     | x::xs, y::ys ->
        if Random.bool () then x::loop xs b
        else y::loop a ys in
  loop a b

看看你是否可以调整选择哪个列表来获取元素的方式,以满足第三个要求。您可能希望在开始之前收集有关列表的一些信息,然后您可以参与决策。