Reputation: 1512
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.
For example:
Function([[1;2;3] ; [2;3] ; [1;2;3] ; [5;6;7]])
returns:
([[3;2;1] ; [2;3] ; [3;2;1] ; [5;6;7]])
I already created a function that reverse a single list:
let rev =
let rec rev_append acc l =
match l with
[] -> acc
| h::t -> rev_append (h::acc) t in
fun l -> rev_append [] l;;
But now i am stuck.
Upvotes: 3
Views: 33058
Reputation: 1930
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]]
Upvotes: 1
Reputation: 25812
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.
Upvotes: 2
Reputation: 35973
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;;
Upvotes: 4