La puissance d'abstraction d'un langage fonctionnel
(quand programmer consiste à rechercher un théorème en mathématiques)
I Récursivité et décomposition par cas
Réduction d'une fraction
Utiliser le lemme d'Euclide :
« Soient a et b deux entiers relatifs.
S'il existe deux entiers relatifs q et r tels que a = b.q + r alors
pgcd(a, b) = pgcd(b,r). »
pour définir une fonction CAML qui calcule le pgcd de deux entiers relatifs.
Arithmétique entière
Définir les opérations arithmétiques sur les entiers naturels (somme, produit, quotient entier, reste)
à partir de 2 opérations prédéfinies: succ (successeur) et pred (prédécesseur).
Fonctions récursives classiques
Factorielle
Fibonnacci
Triangle de Pascal
Ackermann
ack(0,y) = y+1
y>0
ack(x,0) = ack(x-1,1)
x>0
ack(x,y) = ack(x-1,ack(x,y-1))
x>0, y>0
II Fonctions d'ordre supérieur
Somme d'une série entière
Définir une fonction CAML qui, étant donnés une suite u et un entier n,
calcule la somme
des n premiers termes de u:
n-1
Σ
p=0
up
Dérivée
Définir une fonction CAML qui, étant donnés une fonction f à variable réelle et un réel x0,
calcule une valeur approchée de la dérivée f'(x0) de f au point x0 (on supposera que f'(x0) existe).
En déduire l'expression en CAML d'une fonction
qui retourne la dérivée f' d'une fonction dérivable f quelconque.
Composée
Écrire en CAML la définition d'une fonction qui, étant donnés 2 fonctions f et g,
calcule la composée f ° g de f avec g
(on supposera les fonctions f et g du bon type).