enunciado de la práctica 4

Anuncio
Paradigmas de Programación
Práctica 4
La "pseudo­función" rlist definida a continuación permite crear listas "aleatorias" de enteros de la longitud deseada:
let rec rlist r l =
if l <= 0 then []
else Random.int r :: rlist r (l-1);;
¿Es recursiva terminal? Si no lo fuera, ¿qué inconveniente podría tener?
Si no lo es, haga una versión recursiva terminal de la "misma función".
Las siguientes definiciones implementan en ocaml algoritmos de ordenación siguiendo los métodos de selección y de inserción:
let s_sort = function
[] -> []
|h::t ->
let rec aux res m = function
([],[]) -> m::res
| (h::t,[]) -> aux (m::res) h ([],t)
| (l,h::t) -> if h <= m
then aux res m (h::l,t)
else aux res h (m::l,t)
in aux [] h ([], t);;
let rec insert x = function
[] -> [x]
| h::t -> if x <= h then x::h::t
else h::insert x t;;
let rec i_sort = function
[] -> []
| h::t -> insert h (i_sort t);;
¿Son ambas implementaciones recursivas terminales? Si no lo son, ¿supone eso en la práctica algún tipo de limitación?
Compare empíricamente la rapidez en la aplicación de ambos métodos. Puede utilizar para ello la "pseudo­función" rlist definida anteriormente y la "pseudo­función" crono definida a continuación:
let crono f x =
let t = Sys.time () in
let _ = f x in
Sys.time () -. t;;
¿Cuál es más rápida? ¿Cómo crece el tiempo de ejecución con la longitud de la listas?
¿Existen casos especialmente "fáciles" o "difíciles"?
Las definiciones de insert e i_sort no eran recursivas terminales. Realice implementaciones alternativas (t_insert y t_i_sort), para ambas funciones, de modo que sí lo sean. ¿Presenta en la práctica alguna ventaja la función t_i_sort sobre la i_sort? ¿Y algún inconveniente? ¿Cuál es más rápida?
Si la implementación terminal realizada para el método de inserción resultase más lenta que la original, intente mejorarla de modo que no lo sea. Debe tratarse, en todo caso, de una implementación recursiva terminal basada en el método de inserción.
Descargar