(* Look ma! Recursion without an explicit recursion construct! *) let recfact f x = if x <= 0 then 1 else x * (!f (x-1)) let factref = ref (fun x -> x) let fact = let f = recfact factref in (factref := f; f) ;; fact 4;; fact 3;;