(* Cours 1: introduction *)

(* les fonctions *)

let id = fun x -> x;;

(* ... recursives *)


let rec fact = fun n -> 
             if n=0 then 1
                    else n* fact (n-1);;
fact 10;;

(* ... definies par cas *)


let rec fact = function 
                  0 -> 1
               |  n -> n* fact (n-1);;

let rec pgcd = function
                 (0,n) -> n
               | (m,n) -> pgcd (n mod m, m);;

pgcd (30,12);;


(* recursion mutuelle *)


let rec paire = function 0 -> true 
                       | n -> impaire (n-1)
and impaire   = function 0 -> false
                       | n -> paire (n-1);;

(* le filtre "fourre-tout" _ *)


let not = function
            true -> false
          |  _   -> true;;

not true;;
not false;;

let booland = function
            (true,true) -> true
          | (true,false) -> false
          | (false,true) -> false
          | (false,false) -> false;;

let booland = function
            (true,true) -> true
          |      _      -> false;;

booland (false,false);;

(* quelque type interessant *)


let compose = fun f -> fun g -> fun x -> f (g x);;

let k = fun x -> fun y -> x;;

let s = fun x -> fun y -> fun z -> (x z) ( y z);;

(* Des programmes!!!! *)

(* Iterations bornees *)


let rec iter n f = if n = 0 then (fun x -> x)
                            else compose f (iter (n-1) f);;

iter 10 (fun x -> x+1) 1;;

let fibeff n = fst (iter n (fun (x,y) -> (x+y,x)) (1,0));;


(* Iterations non bornees *)



let rec loop p f x = if p x then x else loop p f (f x);;


(* fonction de McCarty *)


let rec mc  n = if n > 100 then n -10
                           else mc (mc (n+11));;