INF121:
Algorithmique et Programmation Fonctionnelle
Cours 4: Fonctions et types récursifs
Année 2015 - 2016
Les précédents épisodes de INF 121
ITypes de base :
Type Opérations Constantes
bool not, &&, || true, false
int +,-,*,/,mod, ... ...,-1, 0, 1, ...
float +.,-.,*.,/. 0.4, 12.3, 16. , 64.
char lowercase, code, ... ’a’, ’u’, ’A’, ...
Iif ... then ... else ... expression conditionnelle
Iidentificateurs (locaux et globaux)
Idéfinition, utilisation et composition de fonctions
Itypes avancés : synonyme, énuméré, produit, somme
Ifiltrage et pattern-matching
1 / 23
Plan
Retour sur les fonctions
Récursivité
Terminaison
Types Récursifs
Conclusion
Définition de fonctions en OCaml
Rappels
let fct_name (p1:t1) (p2:t2) ... (pn:tn) : t=expr
Exemple :
let max2 (x:int) (y:int) : int =if x>ythen xelse y
Une fonction OCaml
Ides paramètres formels (optionnels) : xet y
Iune valeur = l’expression correspondant au corps de la fonction
(qui permet de calculer le résultat)
if x>ythen xelse y
Iun type, qui dépend :
Idu type des paramètres de la fonction
Idu type du résultat
int int int
Iun nom (optionnel) : max2
2 / 23
Appel de fonctions en OCaml
Rappels
Exemple :
I(max2 5 9) (les parenthèses peuvent parfois être omises)
I(max2 (min2 3 8) 9)
I(max2 (5 4) (8 + 3))
Plus généralement :
let fct_name (p1:t1) (p2:t2) ... (pn:tn) : t=expr
Ile type de fct_name est t1 t2 ... tn t
Iappel de la fonction fct_name ànparamètres :
(fct_name e1 e2 ... en)
où :
Ie1,...,en sont les paramètres effectifs
Ichaque paramètre effectif ei a pour type ti
ILe type de (fct_name e1 e2 ... en)est t
3 / 23
Fonctions: SPECIFICATION et IMPLEMENTATION
Il est très important de distinguer 2 concepts/étapes lors de la définition d’une
fonctions (et d’un programme en général)
Spécification:
Une description de ce qui est attendu
Ià un certain niveau d’abstraction
Idoit être suffisamment précis
Iproche d’une description “mathématique”
Ipeut utiliser des exemples pertinents
Un contrat
Fonction
Entrées Sorties
Consiste en:
I1 description
I1 signature
(son type)
Ides exemples
Implémentation:
La description de comment le réaliser
Ile code OCaml
Fonction
Entrées Sorties
Définir une fonction : Spécification PUIS Implémentation
4 / 23
Plan
Retour sur les fonctions
Récursivité
Terminaison
Types Récursifs
Conclusion
Pourquoi la récursivité ?
Exemples de pbs que l’on ne sait pas encore résoudre en OCaml
Icalculer la moyenne de nentiers lus dans un fichier
Icalculer les nombres premiers compris entre 1 et n
Idéfinir une image composée de nfigures géomètriques
Idéfinir un type polynôme
ce qu’il nous manque ?
1. décrire des exécutions comportant un nombre variable de calculs
2. définir des objets de taille importante/variable
En programmation impérative (langage C, INF111) :
instruction itérative (while,for) et tableaux
En programmation fonctionnelle :
la récursivité . . .
5 / 23
A propos de récursivité
Qu’est-ce que la récursivité, qu’est-ce qu’une définition récursive ?
Exemple : Quelques objets récursifs
un+1=F(un)
Images sous licence Creative Common
Fonctions récursives
Ila valeur du résultat est obtenue en exécutant plusieurs fois une même
fonction sur des données différentes :
f(f(f(...f(x0)...)))
Igénéralisation des suites récurrentes
Iun élément de base de la programmation fonctionnelle . . .
Iet beaucoup (beaucoup) d’autres applications en informatique !
6 / 23
Fonctions récursives en OCaml
Un 1er exemple
Exemple : Définition récursive de la factorielle
U0=1
Un=n×Un1,n10! = 1
n! = n×(n1)!,n1
ICette définition fournit un résultat pour tout entier 0 :
elle est bien fondée ...
contre-exemple : U0=1 et Un=n×Un+1,n1
IOn peut montrer sa correction par récurrence sur N:
n.Un=n!
Exemple : Fonction factorielle en OCaml
let rec fact (n:int):int =
if n=0 then 1
else nfact(n1)
let rec fact (n:int):int =
match nwith
01
|nnfact(n1)
7 / 23
Définir une fonction récursive
Spécification: description, signature, exemples, et équations de récurrence
Implémentation: code de la fonction en OCaml
let rec fct_name (p1:t1) (p2:t2) ... (pn:tn):t=expr
expr peut contenir zéro, un ou plusieurs appels à fct_name.
On distinguera différentes sous-expressions de expr :
Iles cas de base : aucun appel à fct_name
Iles cas récursifs : un ou plusieurs appel(s) à fct_name
Les règles de typage sont les mêmes que pour le fonctions non récursives.
Remarque
It1, .., tn peuvent être des types quelconques
IUne fonction récursive ne peut pas être anonyme
8 / 23
Exemples de définitions de fonctions récursives
Exemple : Somme des entiers de 0àn
description + profil + exemples
0
P
i=0
i=0
n
P
i=0
i=n+
n1
P
i=0
isi n>0
let rec sum (n:int) : int =
match nwith
| 0 0
|nn+sum (n1)
Exemple : Division entière
description + profil + exemples
a/b=(0 si a<b
1+ (ab)/bsi ba
let rec div (a:int) (b:int) : int =
if a<bthen 0
else 1 + div (ab) (b)
9 / 23
Essayons . . .
Exercice : reste de la division entière
Définir une fonction qui calcule le reste de la division entière
Exercice : suite de Fibonacci
Implémenter une fonction qui renvoie le nieme terme de Fibonacci où nest
donné comme paramètre. La suite de Fibonnaci est défini comme :
fibn=(1 si n=0 ou n=1
fibn1+fibn2si n>1
10 / 23
Appel et exécution d’une fonction récursive
“Déplier le corps de la fonction” ré-écriture
Exemple : arbre des appels des fonctions factorielle et fibonacci
fact(0) = 1
fact(1)
fact(2)
fact(3) =32=6
1
11=1
21=2
1
2
3fib(4)=3+2=5
fib(3)=2+1=3 fib(2)=1+1=1
fib(2)=1+1=2 fib(1)=1 fib(1)=1 fib(0)=1
fib(1)=1 fib(0)=1
I: ré-écriture des appels générés et suspension des opérations en
cours
I99K: évaluation (en ordre inverse) des opérations suspendues
En OCaml: directive #trace DEMO: Tracer une fonction
11 / 23
Exercice
Exercice: la fonction puissance (2 versions)
(x0=1
xn=xxn1si 0 <n
x0=1
xn= (xx)n/2si nest pair
xn=x(xx)n1
2si nest impair
IDonnez 2 implémentations de la fonction power:int int int en
vous basant sur ces 2 définitions équivalentes.
IQuelle est la différence entre ces deux versions ?
12 / 23
Plan
Retour sur les fonctions
Récursivité
Terminaison
Types Récursifs
Conclusion
Terminaison
Pensez vous que l’exécution de cette fonction termine ?
mac(n) = (n10 si n>100
mac(mac(n+11)) si n100
Et celles-ci ?
La fonction puissance
(x0=1
xn=xxn1si 0 <n
La fonction factorielle
fact(0)1
fact(1) = 1
fact(n) = fact(n+1)
n+1
Il est fondamental de savoir décider si une fonction termine ou non
Peut-on caractériser la terminaison sur l’arbre des appels ?
13 / 23
Comment prouver qu’une fonction récursive termine ?
En utilisant une mesure . . .
Theorem
Toute suite positive strictement décroissante converge
Méthode générale pour prouver qu’une fonction ftermine ?
Dériver une mesure M(f n)t.q. :
IM(f n)est positive
IM(f n)dépend des paramètres de la fonction
IM(f n)décroit strictement entre deux appels récursifs
Ila suite M(f n)converge vers une valeur m0associée à un cas de base
Exemple : Terminaison de la fonction sum
let rec sum (x:int) : int =
match xwith
| 0 0
|xx+sum (x1)
Mesure :
IM(sum n) = n,M(sum n)N
IM(sum n)>M(sum (n1))
puisque n>n1
IM(sum n)converge vers 0.
14 / 23
Terminaison de quelques fonctions
Exercice: trouver les mesures
Prouvez que les fonctions factorielle,puissance,quotient,reste
terminent . . .
15 / 23
Terminaison de quelques fonctions
factorielle et puissance
Terminaison de fact:
let rec fact (n:int):int =
match nwith
01
|nnfact(n1)
IDéfinissons M(fact n) = nN
IM(fact n)>M(fact (n1))
puisque n>n1
IM(fact n)converge vers 0.
Terminaison de power:
let rec power (a:float) (n:int):float =
if (n=0) then 1.
else (if n>0 then a.power a (n1)
else 1. /. (power a (n))
)
IDéfinissons M(power a n) = n
Ipour tout appel récursif M(power a n)N
IM(power a n)>M(power a (n1))
IM(power a n)converge vers 0.
16 / 23
1 / 7 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !