我正在尝试编写一个在给定列表的每个位置插入整数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
和列表的其余部分。通过这种方式,我将获得列表的最终列表,但我没有使用当前的实现...
答案 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 []