Fonctions & procédures DEUG 2 Sciences économiques 2004/2005
Ce qui a été vu Fonctions Procédures 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
Plan Quelques algorithmes sur les fonctions et les procédures Récursivité Fonctions récursives Procédures récursives
Exo1 Que va afficher la procédure d ? Procédure a(i: entier) Début i i+3 Fin Procédure Procédure b(val i: entier) i i+5 Ecrire(i) Procédure c(i: entier) a(i) b(i) Procédure d() Variable i:entier i 2 c(i) ecrire(i)
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
Algorithme 1 On déclare dans la procédure AfficherC une variable T1 de type Tableau On affecte à T1 les éléments du tableau T On trie T1 en faisant appel à la procédure Trier(T1) 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
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: entier Début Pour i = 1 à 10 T1(i) T(i) FinPour FinProcédure
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: entier Début Pour i = 1 à 10 Ecrire(T(i)) FinPour FinProcédure
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’entiers Début Affecter(T, T1) Trier(T1) Afficher(T1) FinProcédure
Algorithme 1 Que pensez-vous de la formulation suivante ? Procédure AfficherC(Val T: Tableau[10] d’entiers) Début Trier(T) Afficher(T) FinProcédure
Algorithme 1 Malheureusement en VBA, quand le paramètre est un tableau, on ne peut pas l’appeler par valeur
Algorithme 2 En utilisant la procédure Trier(T), écrire une fonction ValMax(T) qui Retourne la valeur maximale de T
Algorithme 2 Idée Il suffit de trier T, ensuite Afficher la valeur se trouvant dans la dernière case
Algorithme 2 Fonction ValMax(t : tablea[10] d’entiers) Début Trier(t) Fin Fonction
Récursivité On dit qu’une fonction est récursive quand dans sa définition on fait appel à cette même fonction
Exemple de fonction récursive Ecrire une fonction fact(n) qui prend un enteir n puis retourne n! Fonction fact(n: entier) : entier Variable i, j : entier Début j 1 pour i = 1 à n j j * i FinPour fact j FinFonction
Factorielle On sait que On a défini n! en fonction de (n-1)! 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)
Factorielle Fonction fact(n : entier) : entier Variable i : entier Début Si n = 0 ou n = 1 Alors i 1 FinSi Sinon i n * fact(n-1) FinSinon fact i Finfonction
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
Les suites Fonction U(n : entier) : entier Variable i : entier Début Si n = 1 Alors i 2 FinSi Sinon i 2 + 3 * U(n-1) FinSinon U i Fin Fonction
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)
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
La fonction S(n) Fonction S(n : entier) : entier variable i : entier Début Si n = 1 alors i U(1) FinSi Sinon i U(n) + S(n-1) FinSinon S i Fin Fonction
Version non récursive Fonction S(n : entier) : entier Variable i, j : entier Début i U(1) Pour j = 2 à n i i + U(j) FinPour S j Fin Fonction
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] a b c b a c
Exemple (suite) Il nous est demandé d’écrire une fonction qui retourne une valeur approchée de c telle que f(c) = 0
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
Forme non récursive Fonction S(a, b : réel): réel Variable m : entier Début Tant que (b-a) > 0,00001 Faire m (a+b)/2 Si f(a) * f(m) < 0 Alors b m finsi Sinon a m FinSinon FinTantQue S (a+b) / 2 FinFonction
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) Calculer S(m,b)
Forme récursive (suite) Fonction S(a,b : réel) : réel Variable c : réel Début Si (b-a) < 0,0001 Alors c (a+b)/2 FinSi Sinon Si f(a) * f( (a+b)/2) < 0 Alors c S(a, (a+b)/2) c S( (a+b)/2, b) FinSinon S c Fin fonction
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
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é
Fonction Ind(T, V) Fonction Ind(T: Tableau[10] d’entiers, V: entier) Variable a, b : entier Début a 1 b 11 Tant que T((a+b) Div 2) <> V Faire Si T((a+b) Div 2) > V Alors b (a+b) Div 2 FinSi Sinon a (a+b) Div 2 FinSinon FinTantque Ind (a+b) Div 2 Fin fonction
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
Procédure Afficher Procé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
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