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.