1
Fonctions & procédures
DEUG 2Sciences économiques
2004/2005
2
Ce qui a été vu
• Fonctions– Définition et déclaration
• Retourne une valeur
– Utilisation dans un algorithme– Définition et utilisation en VBA
• Procédures– Définition & déclaration
• Ne retourne pas de valeur
– Utilisation dans un algorithme– Définition et utilisation en VBA
3
Plan
• Quelques algorithmes sur les fonctions et les procédures
• Récursivité– Fonctions récursives– Procédures récursives
4
Exo1• Que va afficher la procédure d ?
Procédure a(i: entier)Début
i i+3Fin Procédure
Procédure b(val i: entier)Début
i i+5Ecrire(i)
Fin Procédure
Procédure c(i: entier)Début a(i) b(i)Fin Procédure
Procédure d()Variable i:entierDébut i 2 c(i) b(i) ecrire(i)Fin Procédure
5
Algorithme 1
• Soit T un tableau de 10 entiers• Supposons que l’on dispose d’une
procédure Trier(T) qui– Trie par ordre croissant le tableau T qui lui
est donné comme paramètre
• Ecrire une procédure AfficherC(T) qui – affiche les éléments de T dans l’ordre
croissant– Sans trier le tableau T
6
Algorithme 1
1. On déclare dans la procédure AfficherC une variable T1 de type Tableau
2. On affecte à T1 les éléments du tableau T
3. On trie T1 en faisant appel à la procédure Trier(T1)
4. On affiche les éléments de T1 à partir du premier élément
– Noter que les étapes 2 et 4 peuvent être définies par des procédures
7
Algorithme 1
• On écrit la procédure Affecter(T,T1) qui affecte les éléments de T à T1
Procédure Affecter(T, T1 : Tableau[10] d’entiers)
Variable i: entierDébut
Pour i = 1 à 10T1(i) T(i)
FinPourFinProcédure
8
Algorithme 1
• On écrit la procédure Afficher(T) qui affiche les éléments d’un tableau
Procédure Afficher(T: Tableau[10] d’entiers)Variable i: entierDébut
Pour i = 1 à 10Ecrire(T(i))
FinPourFinProcédure
9
Algorithme 1
• Maintenant, on peut définir AfficherC(T) plus facilement en utilisant les procédures dont on dispose
Procédure AfficherC(T: Tableau[10] d’entiers)Variable T1: Tableau[10] d’entiersDébut
Affecter(T, T1)Trier(T1)Afficher(T1)
FinProcédure
10
Algorithme 1
• Que pensez-vous de la formulation suivante ?
Procédure AfficherC(Val T: Tableau[10] d’entiers)
DébutTrier(T)Afficher(T)
FinProcédure
11
Algorithme 1
• Malheureusement en VBA, quand le paramètre est un tableau, on ne peut pas l’appeler par valeur
12
Algorithme 2
• En utilisant la procédure Trier(T), écrire une fonction ValMax(T) qui– Retourne la valeur maximale de T
13
Algorithme 2
• Idée– Il suffit de trier T, ensuite– Afficher la valeur se trouvant dans la
dernière case
14
Algorithme 2
Fonction ValMax(t : tablea[10] d’entiers)Début
Trier(t)ValMax T(10)
Fin Fonction
15
Récursivité
• On dit qu’une fonction est récursive quand dans sa définition on fait appel à cette même fonction
16
Exemple de fonction récursive
• Ecrire une fonction fact(n) qui prend un enteir n puis retourne n!
Fonction fact(n: entier) : entierVariable i, j : entierDébut
j 1pour i = 1 à n
j j * iFinPourfact j
FinFonction
17
Factorielle
• On sait que– n! = 1 si n=0 ou n=1– n! = n * (n-1) ! Si n > 1
• On a défini n! en fonction de (n-1)!
• Cette définition peut être utilisée dans la fonction fact(n)
18
Factorielle
Fonction fact(n : entier) : entierVariable i : entierDébut
Si n = 0 ou n = 1 Alorsi 1
FinSiSinon
i n * fact(n-1)FinSinonfact i
Finfonction
19
Exemple : les suites récursives
• Soit la suite (Un) n >0 avec
– U1 = 2
– Un = 3 * Un-1 + 2
• Ecrire une fonction U(n) qui prend un entier n puis retourne la valeur de Un
20
Les suites
Fonction U(n : entier) : entierVariable i : entierDébut
Si n = 1 Alorsi 2
FinSiSinon
i 2 + 3 * U(n-1)FinSinonU i
Fin Fonction
21
Toujours les suites
• En utilisant la suite précédente, écrire une fonction récursive S(n) qui– Prend un entier n puis– Retourne la somme des n premiers
termes de la suite (Un)
22
La somme des n premiers termes
• Il nous faut donc trouver une définition récursive de S(n)
• S(n) = U1 si n = 1
• S(n) = Un + S(n-1) si n > 1
23
La fonction S(n)
Fonction S(n : entier) : entiervariable i : entierDébut
Si n = 1 alorsi U(1)
FinSiSinon
i U(n) + S(n-1)FinSinonS i
Fin Fonction
24
Version non récursive
Fonction S(n : entier) : entierVariable i, j : entierDébut
i U(1)Pour j = 2 à n
i i + U(j)FinPourS j
Fin Fonction
25
Un dernier exemple pour la route
• Soit la fonction numérique f telle que – f est définie, continue sur [a, b], – f est strictement monotone sur [a, b]– f(a) * f(b) < 0
• Le théorème des valeurs intermédiaires nous dit que f(x)=0 admet une solution unique dans l’intervalle [a, b]
ab a
bc c
26
Exemple (suite)
• Il nous est demandé d’écrire une fonction qui retourne une valeur approchée de c telle que f(c) = 0
27
Principe de la méthode de dichotomie
• Soit m le milieu de l’intervalle [a, b],– m = (a + b)/2
• On teste le signe de f(a) * f(m)– Si f(a) * f(m) < 0 alors ceci veut dire que c se trouve
entre a et m• Nous pouvons donc rapprocher le b et le mettre au niveau de
m
– Si f(a) * f(m) > 0 alors ceci veut dire que c se trouve entre m et b
• Nous pouvons donc rapprocher le a et le mettre au niveau de m
• On va répéter ce processus jusqu’à ce que a et b soient très proches ( ex: b – a < 0,0001)– La valeur approchée de c sera alors (a+b)/2
28
Forme non récursiveFonction S(a, b : réel): réelVariable m : entierDébut
Tant que (b-a) > 0,00001 Fairem (a+b)/2Si f(a) * f(m) < 0 Alors
b mfinsiSinon
a mFinSinon
FinTantQueS (a+b) / 2
FinFonction
29
Forme récursive
• Comme toujours, il faut trouver une définition récursive de S
• Si (b-a) < 0,0001 alors – S(a,b) = (a+b)/2
• Sinon– Si f(a) * f(m) <0 alors
• Calculer S(a,m)
– Sinon• Calculer S(m,b)
30
Forme récursive (suite)Fonction S(a,b : réel) : réelVariable c : réelDébut
Si (b-a) < 0,0001 Alorsc (a+b)/2
FinSiSinon
Si f(a) * f( (a+b)/2) < 0 Alorsc S(a, (a+b)/2)
FinSiSinon
c S( (a+b)/2, b)FinSinon
FinSinonS c
Fin fonction
31
Dichotomie• La méthode précédente s’appelle
« dichotomie » car – Elle procède par étapes et– À chaque étape, l’intervalle de recherche
est divisé par 2.
• Ce principe peut être appliqué à plusieurs problèmes
32
Application de la dichotomie
• Écrire une fonction Ind(T, V) qui retourne l’indice de la valeur V dans le tableau T trié par ordre croissant
• Principe: – On compare V par rapport à la valeur se
trouvant dans le milieu du tableau• Si V < T(milieu) alors il faut la chercher dans
la première moitié du tableau• Sinon, il faut la chercher dans la deuxième
moitié
33
Fonction Ind(T, V)Fonction Ind(T: Tableau[10] d’entiers, V: entier)Variable a, b : entierDébut
a 1b 11Tant que T((a+b) Div 2) <> V Faire
Si T((a+b) Div 2) > V Alorsb (a+b) Div 2
FinSiSinon
a (a+b) Div 2FinSinon
FinTantqueInd (a+b) Div 2
Fin fonction
34
Procédures récursives
• Les procédures peuvent elles aussi être définies d’une manière récursive.
• Exemple, écrire une procédure récursive qui permet d’afficher les éléments d’un tableau de 10 entiers.
• Idée:– si l’élément à afficher est le dernier dans le
tableau alors l’écrire et s’arrêter– Sinon, écrire l’élément courant et afficher à partir
du suivant
35
Procédure AfficherProcédure Afficher(i: entier, T:Tableau[10] d’entiers)Début
Ecrire( T(i) )Si i < 10 Alors
Afficher( i+1, T)FinSi
FinProcédure
Quand on fait dans l’algorithme : Afficher(3, T)Cela veut dire qu’on veut afficher à partir de la 3ème
case
36
Que fait la procédure suivante ?
Procédure a(i: entier, T: Tableau[10] d’entiers)Début
Ecrire( T(i) )Si i > 1 Alors
a(i-1, T)FinSi
Fin Procédure