(* Calcul prin aproximări succesive pentru rădăcina pătrată a lui x
   Metoda babiloniană (sau a lui Heron): a_0 = 1, a_{n+1} = (a_n + x/a_n) / 2 *)

(* Aici, condiția de oprire nu e dată de un număr fix de iterații (n)
 * ci de momentul în care am ajuns la o aproximare acceptabilă *)

(* Exprimăm problema: calculează radical din x, *fiind dată* aproximarea a_n,
 * care devine parametru pentru funcția auxiliară approx
 * Ne oprim când două aproximări succesive sunt suficient de apropiate,
 * diferența în valoare absolută e mai mică decât precizia dorită, 10^-6 *)
let mysqrt x =
  let rec approx a_n =        (* folosește argumentul x al lui mysqrt *)
    let a_nxt = (a_n +. x /. a_n) /. 2. in        (* noua aproximație *)
    if abs_float (a_nxt -. a_n) < 1e-6 then a_nxt else approx a_nxt
  in approx 1.                (* apelul inițial: cu prima aproximație = 1 *)

let test2 = mysqrt 2.
let test3 = mysqrt 3.
let test4 = mysqrt 4.

This document was generated using caml2html