在List的每个位置插入一个元素 - ocaml

时间:2013-11-07 20:16:46

标签: recursion ocaml permutation

我正在尝试编写一个在给定列表的每个位置插入整数n的函数。很少的例子,insert_everywhere 0 [1;2] -> [[0;1;2]; [1;0;2]; [1;2;0]]。我写了这个:

let insert_everywhere l n  = 
  let l_aux = [] in 
  let rec aux l1 l2 = match l1 with
    | [] -> []
    | x::tl -> (l_aux @ [n] @ l1) :: aux tl (l_aux @ [x])
  in aux l l_aux
;;

问题是调用aux tl (l_aux @ [x])不能做我想做的事。我的想法是:当我正在阅读我的列表的头部时,我插入另一个列表,我将其附加到数字n和列表的其余部分。通过这种方式,我将获得列表的最终列表,但我没有使用当前的实现...

1 个答案:

答案 0 :(得分:0)

嗯,解决方案与名为zipper的数据结构密切相关。如果aux的第一个参数,你需要保持未评估的列表尾部,并且还要保持列表的评估前缀以构建它的一部分答案。你不需要l_aux,我们将使用第二个参数而不是使用可变变量。我们来看看骨架

let insert_everywhere l (n : int)  =
  let rec aux l1 l2 : int list list = match l1 with
  | [] ->  (* There we need to built a part of answer 
              from l1 prefix, n and empty tail postfix*)
  | x::tl -> (* There we need to construct part of answer *) 
             :: aux tl ( (* construct new prefix from old one and `n` there *) )
  in
  aux l []

如果您仍然找不到答案,可以查看我的解决方案there。当你找到答案时我会把它添加到我的答案中。尽量不要窥视链接! :)

P.S。

let insert_everywhere l (n : int)  =
  let rec aux l1 l2 = match l1 with
  | [] -> [l2 @ [n]]
  | x::tl -> (l2 @ [n] @ l1) :: aux tl (l2 @ [x])
  in
  aux l []