Caml Light fue una implementación ligera del lenguaje de programación Caml desarrollado por INRIA . Ahora está obsoleto. Esta versión de Caml permitía la programación funcional e imperativa , pero no la programación orientada a objetos ofrecida por OCaml , su sucesor.
Este idioma se utilizó en las clases preparatorias científicas de francés ( MPSI, luego MP , opción de computadora) para introducir a los estudiantes a los algoritmos entre 1995 y 2017. Ahora es reemplazado por OCaml.
Para enteros naturales, la función factorial se define por:
y su definición recursiva es:
En Caml Light, esto da:
let rec fact = function | 0 -> 1 | n -> n * fact (n - 1);;El algoritmo euclidiano para calcular el mcd natural de dos enteros u , v , está escrito en Caml Light
let rec pgcd u v = if u = 0 then v else pgcd (v mod u) u;;La secuencia de Fibonacci está definida por:
.
En Caml Light tenemos la versión recursiva ingenua, que se ejecuta en tiempo exponencial :
let rec fibonacci n = match n with | 0 -> 0 | 1 -> 1 | _ -> fibonacci (n - 1) + fibonacci (n - 2) ;; let f = fibonacci 9 ;;o nuevamente, en una versión terminal recursiva tomando como argumento los dos primeros términos y ejecutándose en tiempo lineal :
let rec fibonacci n a b = match n with | 0 -> a | 1 -> b | _ -> fibonacci (n - 1) b (a + b) ;; let f = fibonacci 9 0 1 ;;Normalmente combinamos los dos, para tener una función simple fuera y dentro de la recursividad terminal:
let fibonacci n = (* Définir la version récursive avec récursion terminale… *) let rec fib_2termes n a b = match n with | 0 -> a | 1 -> b | _ -> fib_2termes (n - 1) b (a + b) (* … et l’utiliser. *) in fib_2termes n 0 1 ;; let f = fibonacci 9 ;;También tenemos dos versiones iterativas que se ejecutan en tiempo lineal ( ), la primera en el espacio lineal y la segunda en el espacio constante:
let fibonacci n = (* Un vecteur (tableau) de n+1 éléments entiers initialisés à 1. *) let t = make_vect (n + 1) 1 in (* Calculer ce vecteur pour les éléments n° 2 à n. *) for k = 2 to n do t.(k) <- t.(k - 1) + t.(k - 2) done; (* Le résultat est dans le dernier élément du vecteur. *) t.(n);; let f = fibonacci 9 ;; let fibonacci n = (* 3 variables modifiables (refs) n1, n2, aux. *) let n1 = ref 1 in let n2 = ref 1 in let aux = ref 1 in (* Recalculer itérativement ces variables jusqu’à n. *) (* Syntaxe: !x dénote l’accès à la valeur actuelle de x. *) for k = 2 to n do aux := !n1; n1 := !n2; n2 := !n2 + !aux; done; (* Le résultat est dans n2. *) !y;; let f = fibonacci 9 ;;