Recherche d'un seuil monotone
Exercice · OCaml (option informatique), chapitre 10 — Recherche et dichotomie
Énoncé
Écrire premier_vrai p a b (plus petit x de [a, b] tel que p x, avec p croissant et p b vrai), puis l'utiliser pour retrouver racine.
Corrigé
let premier_vrai p a b =
let g = ref a and d = ref b in
while !g < !d do
let m = (!g + !d) / 2 in
if p m then d := m else g := m + 1
done;
!g
(* Plus grand r tel que r*r <= n : le seuil où (m+1)^2 > n commence. *)
let racine n =
if n = 0 then 0
else premier_vrai (fun m -> (m + 1) * (m + 1) > n) 0 n
premier_vrai encapsule une fois pour toutes le schéma de dichotomie sur un prédicat monotone. On l'instancie avec le prédicat « » (croissant) : son plus petit point vrai est précisément . C'est la puissance des fonctions d'ordre supérieur : un algorithme, mille usages.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.