OCaml (option informatique) · Chapitre 10 · Exercice de TD
Recherche d'un seuil monotone
Recherche et dichotomie · niveau 3 (difficile)
É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.
Exercices semblables
- Logarithme contre linéaire corrigé
- Première occurrence corrigé
- Point d'insertion corrigé
- Racine carrée entière par dichotomie corrigé
- Exponentiation modulaire rapide corrigé