Search code examples
recursionocamltail-recursion

How to make an tail recursive function and test it?


I would like to make this functions recursive but I don't know where to start.

let rec rlist r n =
    if n < 1 then []
    else Random.int r :: rlist r (n-1);;

let rec divide = function
    h1::h2::t -> let t1,t2 = divide t in
        h1::t1, h2::t2
    | l -> l,[];;

let rec merge ord (l1,l2) = match l1,l2 with
    [],l | l,[] -> l
    | h1::t1,h2::t2 -> if ord h1 h2
        then h1::merge ord (t1,l2)
        else h2::merge ord (l1,t2);;

Is there any way to test if a function is recursive or not?


Solution

  • You could do the following :

    let rlist r n =
      let aux acc n =
        if n < 1 then acc
        else aux (Random.int r :: acc) (n-1)
      in aux [] n;;
    
    let divide l =
      let aux acc1 acc2 = function
        | h1::h2::t -> 
            aux (h1::acc1) (h2::acc2) t
        | [e] -> e::acc1, acc2
        | [] -> acc1, acc2
      in aux [] [] l;;
    

    But for divide I prefer this solution :

     let divide l =
       let aux acc1 acc2 = function
         | [] -> acc1, acc2
         | hd::tl -> aux acc2 (hd :: acc1) tl
       in aux [] [] l;;
    
    let merge ord (l1,l2) = 
      let rec aux acc l1 l2 = 
        match l1,l2 with
          | [],l | l,[] -> List.rev_append acc l
          | h1::t1,h2::t2 -> if ord h1 h2
            then aux (h1 :: acc) t1 l2
            else aux (h2 :: acc) l1 t2
      in aux [] l1 l2;;
    

    As to your question about testing if a function is tail recursive or not, by looking out for it a bit you would have find it here.