How to reverse even sublists of a list if we assume that we count elements from 0. I want the solution to be \"manually-coded\". I\'ve got a big problem with this task.
let rev_list l =
let rec rev_acc acc = function
| [] -> acc
| hd::tl -> rev_acc (hd::acc) tl
in
rev_acc [] l
let rev_even l =
let rec rev i acc = function
| [] -> rev_list acc
| hd::tl ->
if i mod 2 = 0 then rev (i+1) ((rev_list hd)::acc) tl
else rev (i+1) (hd::acc) tl
in
rev 0 [] l
note that they are all tail-recursive
edit
A suggestion to Noran:
tail-recursive is quite important in functional programming and OCaml. Please bear in mind.
let rec todo l = let rec aux r = function
| [] -> []
| h::t -> (if r then h else rev h)::(aux (not r) t)
in aux true l;;
For fun, I've done a stuff like this,
let rev_at_even_idx list =
let s0, s1 = ([], 0), [] in
let aux0 (a, i) x =
(x, i mod 2) :: a, succ i
in
let aux1 a = function
| l, 0 -> List.rev l :: a
| l, _ -> l :: a
in
List.fold_left aux1 s1
@@ fst @@
List.fold_left aux0 s0 list
;;
rev_at_even_idx [[1;2;3] ; [2;3] ; [1;2;3] ; [5;6;7]];;
- : int list list = [[3; 2; 1]; [2; 3]; [3; 2; 1]; [5; 6; 7]]