Ariel Grabijas
Ariel Grabijas

Reputation: 1512

List reversing in Ocaml

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

Answers (3)

zurgl
zurgl

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

Jackson Tale
Jackson Tale

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

phimuemue
phimuemue

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

Related Questions