| Université Paris 6 Licence d'informatique | Module de Programmation Année 2000-2001 |
|---|
let rec fact n = if n <= 0 then 1 else n*(fact (n-1)) ;;
On peut donner une version récursive terminale de cette
fonction en définissant une fonction récursive ayant un argument
supplémentaire appelé accumulateur.
let rec fact_t a n =
if n <= 0 then a else (fact_t (n*a) (n-1));;
let fact'n = fact_t 1 n;;
(fact' n) (par récurrence sur n).
let rec lmin l = match l with
| [] -> failwith "lmin: []"
| [x] -> x
| x::l' -> (min x (lmin l')) ;;
Sur le principe utilisé ci-dessus, donnez une version
récursive terminale de la fonction lmin.
let rec reverse l = match l with
| [] -> []
| x::l' -> (reverse l')@[x];;
Sur le principe utilisé ci-dessus, donnez une version
récursive terminale reverse2 de la fonction reverse.
let fact n =
let a = ref 1 in
let rec fact_r n =
if n <= 0 then !a else begin a := n*(!a); fact_r (n-1) end
in fact_r n;;
let f1 = function () ->
let c = ref 0 in (c := !c+1; !c) ;;
f1 () ;;
f1 () ;;
let f2 =
let c = ref 0 in function () -> (c := !c+1; !c);;
f2 () ;;
f2 () ;;
Détaillez l'évaluation de cette suite de phrases.
let fact n =
let a = ref 1 and i = ref 1 in
let rec fact_b() =
if n < (!i)
then !a
else begin a := (!i) * (!a); i := !i + 1; fact_b() end
in fact_b() ;;
Ce document a été traduit de LATEX par HEVEA.