在偶数位置反转列表元素

时间:2014-01-23 09:20:15

标签: ocaml

我知道如何反转“手动编码”列表:

let rev_list l =
  let rec rev_acc acc = function
    | [] -> acc
    | hd::tl -> rev_acc (hd::acc) tl
  in 
  rev_acc [] l

现在我尝试仅反转那些处于偶数位置的元素,这意味着输入:

Function([0;1;2;3;4;5;6;7])

返回是:

[6;1;4;3;2;5;0;7]

如果我们假设我们计算0中的元素,我该怎么做?

1 个答案:

答案 0 :(得分:1)

(* integrate [x1;x2;x3] [y1;y2;y3] = [x1;y1;x2;y2;x3;y3] *)
let integrate l1 l2 = 
  let rec integrt acc = function
    | [], [] -> List.rev acc
    | hd::tl,[] | [], hd::tl -> integrt (hd::acc) (tl,[])
    | hd1::tl1, hd2::tl2 -> integrt (hd2::hd1::acc) (tl1,tl2)
  in 
  integrt [] (l1,l2)

let rev_list_even_pos l=
  let rec rev r_acc acc i = function
    | [] -> integrate r_acc (List.rev acc)
    | hd::tl ->
      if i mod 2 = 0 then rev (hd::r_acc) acc (i+1) tl
      else rev r_acc (hd::acc) (i+1) tl
  in 
  rev [] [] 0 l

诀窍是使用两个单独的列表:一个存储颠倒的元素,另一个存储元素按原始顺序。