Adloun

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.