algorithmique et programmation avancée - le mans university
TRANSCRIPT
![Page 1: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/1.jpg)
1
Algorithmique et programmation avancée
Licence SPI 2e année Loïc Barrault ([email protected]) Bruno Jacob ([email protected]) et Aina Lekira, Grégor Dupuy (TP)
![Page 2: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/2.jpg)
2
Organisation
¡ De janvier à avril ¡ 12 cours, 12 TD, 12 TP ¡ Documents
l Polycopié « Le langage C » de L1 ¡ Contrôle des connaissances
l Contrôle continu l TP notés
¡ Travail personnel l Relire le cours l Refaire les exercices des TD l Préparer les TP
![Page 3: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/3.jpg)
3
Plan du cours
Partie I ¡ Retour (rapide) sur les variables et
leur portée ¡ Récursivité ¡ Types abstraits
l Arbres l Tables
![Page 4: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/4.jpg)
4
Chapitre 1
Retour rapide sur les variables et leur portée
![Page 5: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/5.jpg)
1) Définition
¡ Variable = zone mémoire l accessible par un nom l lecture et écriture l Taille définie par le type
¡ Syntaxe déclaration : l <type> NOM = init_val; l <type> NOM1 {=init_val}, NOM2 [=init_val2]; l <type> TAB[10], NOM; l <type> * ptr;
¡ Un pointeur est une variable pouvant contenir une adresse !
5
![Page 6: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/6.jpg)
2) Notion de bloc
¡ Bloc : espace défini par une accolade ouvrante et une fermante l Structure de contrôle
¡ if(){BLOC}, while(){BLOC}, etc. l Fonctions
¡ int fct(<params) {}
¡ Dans un bloc : deux variables ne peuvent avoir le même nom
6
![Page 7: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/7.jpg)
3) Variable locale
¡ Déclarée à l’intérieur d’un bloc ¡ Existe à partir de la déclaration ¡ Est détruite à la fin du bloc !
7
![Page 8: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/8.jpg)
4) Variables globales
l Déclarée en dehors de tout bloc l Existe à partir de la déclaration l Est détruite à la fin du programme
l Accessible depuis tout endroit du fichier (module) ¡ Mot clé extern pour exploiter une
variable globale d’un autre module
8
![Page 9: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/9.jpg)
Variable locale vs globale
¡ Une variable locale peut avoir le même nom qu’une variable globale l Masquage de la variable globale
9
int i=0; int main(void) {
int i=2; printf("i=%i », i);
}
![Page 10: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/10.jpg)
10
Chapitre 2
Récursivité
![Page 11: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/11.jpg)
11
1) Définition
Une fonction récursive est une
fonction qui fait appel à elle-même. Équivalent en mathématiques: la
définition par récurrence
![Page 12: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/12.jpg)
12
Exemple : calcul de factorielle
La factorielle de n est définie par ¡ 1! = 1 ¡ n! = n * (n-1)! pour n > 1
1. Cas où le résultat est immédiat 2. Cas où le résultat se calcule par
récursivité
![Page 13: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/13.jpg)
13
Exemple : fonction factorielle
int fact(int n) /* fonction qui renvoie n! */ {
if (n == 1) return 1; return n * fact(n-1);
} Appel : printf(‘‘%i’’, fact(3))
![Page 14: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/14.jpg)
14
Exemple
fact(3) = 3*fact(2) = 6 ê fact(2) = 2*fact(1) = 2
ê fact(1) = 1
![Page 15: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/15.jpg)
15
Exemple
Dans cette fonction, les calculs s’effectuent au retour des appels récursifs
fact(3) → fact(2) → fact(1)
↓ 6 ← 2 ← 1
![Page 16: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/16.jpg)
16
Variante de la fonction factorielle
int fact2(int n, int result) /* fonction qui renvoie n! */ {
if (n == 1) return result; return fact2(n-1, n*result);
} Appel : printf(‘‘%i’’, factorielle(3,1))
![Page 17: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/17.jpg)
17
Variante
fact(3,1) = fact(2,3) = fact(1,6) = 6
![Page 18: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/18.jpg)
18
Variante
Dans cette fonction, les calculs s’effectuent au moment des appels récursifs
fact(3,1) → fact(2,3) → fact(1,6)
↓ 6 ← 6 ← 6
![Page 19: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/19.jpg)
19
2) Objets locaux et globaux
A l’exécution, il est créé en mémoire autant d’exemplaires de la fonction qu’il y a d’appels récursifs.
Chaque exemplaire de la fonction
contient un exemplaire des variables locales et des paramètres fixes.
![Page 20: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/20.jpg)
20
Exemple : duplication du paramètre fixe
fact(int n) n vaut 3
fact(int n) n vaut 2
fact(int n) n vaut 1
![Page 21: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/21.jpg)
21
Exemple : duplication des variables locales
f_rec(void) int a; a vaut 5
f_rec(void) int a; a vaut 8
f_rec(void) int a; a vaut 2
![Page 22: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/22.jpg)
22
Objets globaux
En revanche, les variables globales n’existent qu’en un seul exemplaire et sont partagées par tous les exemplaires de la fonction récursive.
Il en va de même pour les paramètres modifiables (pointeurs).
![Page 23: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/23.jpg)
23
Exemple
Problème : lire une suite d’entiers positifs terminée par un marqueur et calculer la somme ou le produit selon que le marqueur vaut -1 ou -2
5 8 2 -1 résultat 5+8+2=15 1 2 1 4 -2 résultat 1*2*1*4=8
![Page 24: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/24.jpg)
24
Exemple
Problème : lire une suite d’entiers positifs terminée par un marqueur et calculer la somme ou le produit selon que le marqueur vaut -1 ou -2
Écrire un programme récursif pour
traiter ce problème (sans utiliser de pile ni de tableau)
![Page 25: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/25.jpg)
25
Remarques
On ne peut pas faire le calcul au fur et à mesure car l’opérateur n’est connu qu’à la fin → il faut mémoriser chaque valeur lue dans une variable locale
L’opérateur et le résultat sont
uniques → on peut utiliser une variable globale ou un paramètre pointeur
![Page 26: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/26.jpg)
26
Programme (1)
int marqueur; /* -1 ou -2 */ int resultat /* valeur du résultat */ void calcul (int * result) { int x; scanf(‘‘%i’’, &x);
![Page 27: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/27.jpg)
27
Programme (2)
if (x == -1){ marqueur = -1; *result = 0; } else if (x == -2){ marqueur = -2; *result = 1; }
![Page 28: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/28.jpg)
28
Programme (3)
else /* x est un entier positif */ { calcul(result); if (marqueur == -1) *result = *result + x; else *result = *result * x; }
}
![Page 29: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/29.jpg)
29
Programme (4)
int main() { calcul (&resultat); printf(‘‘La valeur est : %i’’,resultat);
}
![Page 30: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/30.jpg)
30
Exemple
résultat : 15 marqueur : -1 calcul calcul calcul calcul x = 5 x = 8 x = 2 x = -1 5 8 2 -1 é
![Page 31: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/31.jpg)
31
Remarque
Dans cet exemple, chacune des variables globales marqueur et resultat pourrait être passée en paramètre ou non
void calcul (int * result, int * marq) void calcul (int * result) void calcul (int * marq) void calcul (void)
![Page 32: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/32.jpg)
32
3) Récursivité et itération
Tout algorithme récursif peut être
transformé en algorithme itératif, et réciproquement.
![Page 33: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/33.jpg)
33
Factorielle récursif ↔ itératif
int fact(int n) int fact(int n) { {
if (n == 1) int res; return 1; res = n; return n*fact(n-1); while(n!=1){
} n = n - 1; res = res*n; } return res; }
![Page 34: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/34.jpg)
34
Choisir entre itératif et récursif
Version récursive l Elle est plus naturelle quand on part
d’une définition récursive l Elle est plus simple en cas de
récursivité multiple (ex: parcours d’arbres)
l Elle s’impose en programmation fonctionnelle (Lisp, Caml) ou déclarative (Prolog)
![Page 35: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/35.jpg)
35
Choisir entre itératif et récursif
Version itérative l Elle est beaucoup plus économique à
l’exécution (pas de duplication de la fonction)
![Page 36: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/36.jpg)
36
Choisir entre itératif et récursif
Bilan ¡ En programmation impérative, il
faut établir un compromis entre simplicité des algorithmes et coût d’exécution
¡ On préfère en général la version itérative, pour son efficacité
![Page 37: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/37.jpg)
37
4) Transformation récursif → itératif
Tout algorithme récursif peut être transformé en un algorithme itératif équivalent : c’est la dérécursivation.
La méthode à suivre dépend du type
de récursivité de l’algorithme.
![Page 38: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/38.jpg)
38
Récursivité terminale et non-terminale
Un algorithme est dit récursif terminal
s’il ne contient aucun traitement après un appel récursif.
![Page 39: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/39.jpg)
39
Exemple
La fonction fact2 est récursive terminale : elle n’effectue aucun traitement après l’appel récursif
int fact2(int n, int result) /* fonction qui renvoie n! */ {
if (n == 1) return result; return fact2(n-1, n*result);
}
![Page 40: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/40.jpg)
40
Fonction récursive terminale
type f_rec(params) if (condition) traitement1 else { traitement2 f_rec(nouv_params) }
![Page 41: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/41.jpg)
41
Sur l’exemple
type f_rec(params)
if (condition) n == 1 traitement1 return result else { traitement2 (vide) f_rec(nouv_params) n-1, n*result }
![Page 42: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/42.jpg)
42
Fonction itérative équivalente
type f_iter(params) while (non condition) { traitement2 params = nouv_params } traitement1
![Page 43: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/43.jpg)
43
Exemple
int fact2_iter(int n, int result) {
while (n!=1) { n = n - 1; result = result*n; } return result;
}
![Page 44: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/44.jpg)
44
Récursivité terminale et non-terminale
Réciproquement, une fonction est
récursive non terminale si elle effectue un traitement après un appel récursif.
![Page 45: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/45.jpg)
45
Exemple
La fonction fact est récursive non terminale : elle effectue une multiplication après l’appel récursif
int fact(int n) /* fonction qui renvoie n! */ {
if (n == 1) return 1; return n * fact(n-1);
}
![Page 46: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/46.jpg)
46
Fonction récursive non terminale
type f_rec(params) if (condition) traitement1 else { traitement2 f_rec(nouv_params) traitement3(nouv_params) }
![Page 47: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/47.jpg)
47
Dé-récursivation d’une fonction récursive non terminale
Première méthode Transformer la fonction pour obtenir une
fonction récursive terminale, puis se ramener au premier cas.
En général, cela nécessite d’ajouter un paramètre.
Exemple fact(int n) → fact(int n, int result)
![Page 48: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/48.jpg)
48
Dé-récursivation d’une fonction récursive non terminale
Deuxième méthode Quand la transformation n’est pas possible
(récursivité multiple), on introduit une pile dans laquelle on stocke les paramètres de l’appel récursif.
Cette méthode est plus complexe à réaliser.
![Page 49: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/49.jpg)
49
Dé-récursivation d’une fonction récursive non terminale
void quicksort(i,j) void quicksort (i,j)
int milieu; empiler(0,N-1); while(!pilevide()){ depiler(i,j);
if(i<j){ if(i<j){ m = partition(i,j); m = partition(i,j); quicksort(i,m-1); empiler(i,m-1); quicksort(m+1,j); empiler(m+1,j);
} } }
![Page 50: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/50.jpg)
50
5) Différents types de récursivité
¡ Récursivité simple
¡ Récursivité multiple
¡ Récursivité croisée
¡ Récursivité imbriquée
![Page 51: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/51.jpg)
51
a) Récursivité multiple
La fonction effectue plusieurs appels récursifs consécutifs.
Exemple Calcul des combinaisons Cn
p ¡ Cn
p = 1 si p = 0 ou p = n ¡ Cn
p = Cn-1p + Cn-1
p-1 sinon
![Page 52: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/52.jpg)
52
Récursivité multiple
int comb(int n, int p) /* calcule récursivement Cn
p */ {
if (p == 0 || p == n) return 1; else return comb(n-1,p) + comb(n-1,p-1);
}
![Page 53: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/53.jpg)
53
Application
Dérouler l’exécution de comb(3,2) en faisant apparaître chaque appel récursif et donner le résultat
comb(3,2)
comb(…,…)
![Page 54: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/54.jpg)
54
Application
comb(3,2) = 3 comb(2,2) comb(2,1) = 2 =1 comb(1,1) comb(1,0) =1 =1
![Page 55: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/55.jpg)
55
b) Récursivité mutuelle (ou croisée)
Des définitions sont mutuellement récursives si elles dépendent l’une de l’autre.
Exemple Définition de la parité ¡ n est pair si n=0 ou si (n-1) est impair ¡ n est impair si n=1 ou si (n-1) est pair
![Page 56: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/56.jpg)
56
Récursivité mutuelle int pair(int n){
if(n==0) return vrai; else return impair(n-1);
} int impair(int n){
if(n==0) return faux; else return pair(n-1);
}
![Page 57: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/57.jpg)
57
Application
Dérouler l’exécution de ¡ pair(3) ¡ pair(2) en faisant apparaître chaque appel
récursif et donner le résultat
![Page 58: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/58.jpg)
58
Application : 3 est-il pair ?
pair(3) faux ê é
impair(2) faux ê é
pair(1) faux ê é
impair(0) → faux
![Page 59: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/59.jpg)
59
Application : 2 est-il pair ?
pair(2) vrai ê é
impair(1) vrai ê é
pair(0) → vrai
![Page 60: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/60.jpg)
60
c) Récursivité imbriquée
Un paramètre de l’appel récursif est lui-même issu d’un appel récursif
Exemple Calcul de la fonction d’Ackermann ¡ A(m,n)=n+1 si m=0 ¡ A(m,n)=A(m-1,1) si m>0 et n=0 ¡ A(m,n)=A(m-1,A(m,n-1)) sinon
![Page 61: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/61.jpg)
61
Récursivité imbriquée
int ack(int m, int n) {
if (m==0) return n+1; else if (m>0 && n==0) return ack(m-1,1); else return ack(m-1, ack(m,n-1));
}
![Page 62: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/62.jpg)
62
Application
Dérouler l’exécution de ack(1,1) en faisant apparaître chaque appel récursif et donner le résultat
![Page 63: Algorithmique et programmation avancée - Le Mans University](https://reader036.vdocuments.mx/reader036/viewer/2022062510/62b167d309cc4627213c2ee2/html5/thumbnails/63.jpg)
63
Application
ack(1,1) = 3 c ack(0, ack(1, 0)) → ack(0,2) b =3 a ack(0,1) =2 a