Récursion et programmation fonctionnelle
INFO1 - Semaine 36
Guillaume CONNAN
IUT de Nantes - Dpt d'informatique
Dernière mise à jour : 2 septembre 2012
(IUT de Nantes - Dpt d'informatique ) 1 / 26
1 Un petit jeu pour commencer 2 Fonction
Souvenirs du lycée
Langage des expressions 3 Récursion
Récursion, récurrence, induction Induction mathématique
(IUT de Nantes - Dpt d'informatique ) 2 / 26
Sommaire
1 Un petit jeu pour commencer 2 Fonction
Souvenirs du lycée
Langage des expressions 3 Récursion
Récursion, récurrence, induction Induction mathématique
(IUT de Nantes - Dpt d'informatique ) 3 / 26
arrivee);
print newline();;
mouvement élémentaire
let rec hanoi a b c= function
| 0−> () (* 0 d i s q u e : on ne f a i t r i e n *)
| n−> hanoi a c b (n-1); (* n−1 d i s q u e s s o n t d é p l a c é s de a v e r s b *)
mvt a c; (* on d é p l a c e l e d i s q u e r e s t a n t en a v e r s c *) hanoi b a c (n-1) (* n−1 d i s q u e s s o n t d é p l a c é s de b
v e r s c *);;
résolution récursive du problème des tours de Hanoï
(IUT de Nantes - Dpt d'informatique ) 4 / 26
let mvt depart arrivee=
print string
("Déplace un disque de la tige "^depart^" vers la tige "^
arrivee);
print newline();;
mouvement élémentaire
let rec hanoi a b c= function
| 0−> () (* 0 d i s q u e : on ne f a i t r i e n *)
| n−> hanoi a c b (n-1); (* n−1 d i s q u e s s o n t d é p l a c é s de a v e r s b *)
mvt a c; (* on d é p l a c e l e d i s q u e r e s t a n t en a v e r s c *) hanoi b a c (n-1) (* n−1 d i s q u e s s o n t d é p l a c é s de b
v e r s c *);;
résolution récursive du problème des tours de Hanoï
(IUT de Nantes - Dpt d'informatique ) 4 / 26
# hanoi "A" "B" "C" 3;;
Déplace un disque de la tige A vers la tige C Déplace un disque de la tige A vers la tige B Déplace un disque de la tige C vers la tige B Déplace un disque de la tige A vers la tige C Déplace un disque de la tige B vers la tige A Déplace un disque de la tige B vers la tige C Déplace un disque de la tige A vers la tige C - : unit = ()
(IUT de Nantes - Dpt d'informatique ) 5 / 26
# hanoi "A" "B" "C" 4;;
Déplace un disque de la tige A vers la tige B Déplace un disque de la tige A vers la tige C Déplace un disque de la tige B vers la tige C Déplace un disque de la tige A vers la tige B Déplace un disque de la tige C vers la tige A Déplace un disque de la tige C vers la tige B Déplace un disque de la tige A vers la tige B Déplace un disque de la tige A vers la tige C Déplace un disque de la tige B vers la tige C Déplace un disque de la tige B vers la tige A Déplace un disque de la tige C vers la tige A Déplace un disque de la tige B vers la tige C Déplace un disque de la tige A vers la tige B Déplace un disque de la tige A vers la tige C Déplace un disque de la tige B vers la tige C - : unit = ()
(IUT de Nantes - Dpt d'informatique ) 6 / 26
1 Un petit jeu pour commencer 2 Fonction
Souvenirs du lycée
Langage des expressions 3 Récursion
Récursion, récurrence, induction Induction mathématique
(IUT de Nantes - Dpt d'informatique ) 7 / 26
Sommaire
1 Un petit jeu pour commencer 2 Fonction
Souvenirs du lycée
Langage des expressions 3 Récursion
Récursion, récurrence, induction Induction mathématique
(IUT de Nantes - Dpt d'informatique ) 8 / 26
Soit f la fonction qui à un entier k associe l'entier naturel k2. Calculer f (2) et f (2−3) .
(IUT de Nantes - Dpt d'informatique ) 9 / 26
function F (X: in INTEGER) return INTEGER is begin
return X*X;
end F;
let f = fun x−> x*x ;;
(IUT de Nantes - Dpt d'informatique ) 10 / 26
function F (X: in INTEGER) return INTEGER is begin
return X*X;
end F;
let f = fun x−> x*x ;;
(IUT de Nantes - Dpt d'informatique ) 10 / 26
puissance(x,n)=x×x× · · · ×x
| {z }
n fois
(IUT de Nantes - Dpt d'informatique ) 11 / 26
puissance=[f| ∀x (x∈R∧f (x,0)=1)∧ ∀x∀n ((x,n)∈R×N∧f (x,n+1)=x×f (x,n))]
(IUT de Nantes - Dpt d'informatique ) 12 / 26
Sommaire
1 Un petit jeu pour commencer 2 Fonction
Souvenirs du lycée
Langage des expressions 3 Récursion
Récursion, récurrence, induction Induction mathématique
(IUT de Nantes - Dpt d'informatique ) 13 / 26
2*(3+4) a*(b+c)
(IUT de Nantes - Dpt d'informatique ) 14 / 26
2*(3+4) a*(b+c)
(IUT de Nantes - Dpt d'informatique ) 14 / 26
# let g = fun x−> x *. x;;
val g : float−> float = <fun>
# f(3);;
- : int = 9
# f(1.2);;
Characters 1-6:
f(1.2);;
^^^^^
Error: This expression has type float but an expression was expected of type int
(IUT de Nantes - Dpt d'informatique ) 15 / 26
let f = fun k−> k*k;;
val f : int−> int = <fun>
# let g = fun x−> x *. x;;
val g : float−> float = <fun>
# f(3);;
- : int = 9
# f(1.2);;
Characters 1-6:
f(1.2);;
^^^^^
Error: This expression has type float but an expression was expected of type int
(IUT de Nantes - Dpt d'informatique ) 15 / 26
# let g = fun x−> x *. x;;
val g : float−> float = <fun>
# f(3);;
- : int = 9
# f(1.2);;
Characters 1-6:
f(1.2);;
^^^^^
Error: This expression has type float but an expression was expected of type int
(IUT de Nantes - Dpt d'informatique ) 15 / 26
let f = fun k−> k*k;;
val f : int−> int = <fun>
# let g = fun x−> x *. x;;
val g : float−> float = <fun>
# f(3);;
- : int = 9
# f(1.2);;
Characters 1-6:
f(1.2);;
^^^^^
Error: This expression has type float but an expression was expected of type int
(IUT de Nantes - Dpt d'informatique ) 15 / 26
# let g = fun x−> x *. x;;
val g : float−> float = <fun>
# f(3);;
- : int = 9
# f(1.2);;
Characters 1-6:
f(1.2);;
^^^^^
Error: This expression has type float but an expression was expected of type int
(IUT de Nantes - Dpt d'informatique ) 15 / 26
# let h = fun a b−> f (b-a);;
val h : int−> int−> int = <fun>
# h 7 3;;
- : int = 16
Comment a été calculé h 7 3 ?
(IUT de Nantes - Dpt d'informatique ) 16 / 26
# let h = fun a b−> f (b-a);;
val h : int−> int−> int = <fun>
# h 7 3;;
- : int = 16
Comment a été calculé h 7 3 ?
(IUT de Nantes - Dpt d'informatique ) 16 / 26
let hh a b = let ff k =
fun k−> k*k
in
ff (b-a);;
(IUT de Nantes - Dpt d'informatique ) 17 / 26
1 Un petit jeu pour commencer 2 Fonction
Souvenirs du lycée
Langage des expressions 3 Récursion
Récursion, récurrence, induction Induction mathématique
(IUT de Nantes - Dpt d'informatique ) 18 / 26
Sommaire
1 Un petit jeu pour commencer 2 Fonction
Souvenirs du lycée
Langage des expressions 3 Récursion
Récursion, récurrence, induction Induction mathématique
(IUT de Nantes - Dpt d'informatique ) 19 / 26
induction
induction mathématique (raisonnement par récurrence) fonction récursive, type récursif
(IUT de Nantes - Dpt d'informatique ) 20 / 26
induction
induction mathématique (raisonnement par récurrence) fonction récursive, type récursif
(IUT de Nantes - Dpt d'informatique ) 20 / 26
induction
induction mathématique (raisonnement par récurrence) fonction récursive, type récursif
(IUT de Nantes - Dpt d'informatique ) 20 / 26
Sommaire
1 Un petit jeu pour commencer 2 Fonction
Souvenirs du lycée
Langage des expressions 3 Récursion
Récursion, récurrence, induction Induction mathématique
(IUT de Nantes - Dpt d'informatique ) 21 / 26
1 2 3 4
1 2 3 4 5
(IUT de Nantes - Dpt d'informatique ) 22 / 26
n!=1×2×3× · · · ×(n−1)×n
fac(n): si n=1 alors 1 sinon n*(fac (n-1))
(IUT de Nantes - Dpt d'informatique ) 23 / 26
n!=1×2×3× · · · ×(n−1)×n
fac(n): si n=1 alors 1 sinon n*(fac (n-1))
(IUT de Nantes - Dpt d'informatique ) 23 / 26
Exercice 1
Pour la factorielle, on prouve par récurrence quefac(n) calcule bien n! et que le nombre d'appels de la fonctionfacengendrés par le calcul defac(n) est égal à n−1 : faites-le !
(IUT de Nantes - Dpt d'informatique ) 24 / 26
fac(n): si n=1 alors 1 sinon (fac (n+1))/(n+1)
(IUT de Nantes - Dpt d'informatique ) 25 / 26
let rec fac = function
|1−> 1
|n−> n*fac(n-1);;
let rec fac n =
if n = 1 then 1 else n*fac(n-1);;
let rec fac n = match n with
|1−> 1
|_−> n*fac (n-1);;
let fac n =
let rec temp = function
|1,acc−> acc
|n,acc−> temp(n-1 , n*acc)
in
temp(n,1);;
(IUT de Nantes - Dpt d'informatique ) 26 / 26