comment retrouver la forme récursive
TRANSCRIPT
Comment trouver la forme récursive?
Mariem ZAOUALIAssistante contractuelle à l’Institut National
des Sciences Appliquées et de Technologie – INSAT - TUNIS
NB : Téléchargez la présentation pour voir l’animation
Exemple Ecrire une fonction récursive en C qui
permet de convertir un entier en binaire
L’astuce est la suivante : Soit 42 est l’entier à convertir, sa conversion binaire est 101010
Exemple Soit:
42 2
210 2
1 10
0
2
5
1
22 2
2101 0
Le résultat de 42 est 101010 (lecture inverse des restes)
1 – La première étape pour établir une forme récursive est de chercher une condition d’arrêt : Quand dois-je m’arrêter? Sinon l’appel récursif sera infini ou finira avec une erreur!
Etape 1 Dans ce cas, la condition d’arrêt est
lorsque je trouve un « 0 » comme quotient
42 2
210 2
1 10
0
2
5
1
22 2
2101 0
Etape 1 Ainsi la première forme de notre
fonction récursive est la suivante int Binaire (int nbre_a_convertir){ if(nbre_a_convertir / 2 == 0) return nbre_a_convertir % 2; } La question qui se pose maintenant
est : comment atteindre cette condition d’arrêt?
Etape 2 Il faut trouver un lien entre le nombre à
entrer au départ et la condition d’arrêt.
Etape 2 Dresser l’arbre de dépendance entre
les appels récursifsBinaire(42)
Binaire(21)
Binaire(10)
Binaire(5)
Binaire(2)
Binaire(1)
Etape 2 Dresser l’arbre de dépendance entre
les appels récursifsBinaire(42)
Binaire(21)
Binaire(10)
Binaire(5)
Binaire(2)
Binaire(1) Retourne 1 : le reste
Fait appel à Binaire(1)
Fait appel à Binaire(2)
Fait appel à Binaire(5)
Fait appel à Binaire(10)
Fait appel à Binaire(21)
Pour passer de 42 à 21 il faut prendre le quotient de 42/2
La même chose pour les autres : pour passer d’un appel à un autre il faut passer le quotient du nombre courant
Etape 2 Ca veut dire
Binaire(42)
Binaire(21)
Binaire(10)
Binaire(5)
Binaire(2)
Binaire(1) Retourne 1 : le reste
Fait appel à Binaire(2 DIV 2)
Fait appel à Binaire(5 DIV 2)
Fait appel à Binaire(10 DIV 2)
Fait appel à Binaire(21 DIV 2)
Fait appel à Binaire(42 DIV 2)
Etape 2 Ainsi la nouvelle forme de la méthode
récursive estint Binaire (int nbre_a_convertir){ if(nbre_a_convertir / 2 == 0) return nbre_a_convertir % 2;
elsereturn Binaire(nbre_a_convertir/2);
}
Etape 3 Testez votre méthode : le résultat de
42 sera 1 .. Où sont passés les autres chiffres?
Tel qu’on a écrit la méthode, nous ne sommes pas entrain de sauvegarder les résultats des états intermédiaires avant d’atteindre la condition d’arrêt
Etape 3 Pour ne pas les perdre, on suggère de
multiplier par 10 l’appel récursif
Pourquoi?› On remarque que le premier nombre à être
retourné est celui de la condition d’arrêt et c’est bien le premier nombre à gauche du résultat soit 101010
› Voyons comment le résultat se forme
Etape 3 Dresser l’arbre de dépendance entre
les appels récursifsBinaire(42)
Binaire(21)
Binaire(10)
Binaire(5)
Binaire(2)
Binaire(1) Retourne 1 : le reste
Fait appel à Binaire(1)*10 et retourne 1*10=10
Fait appel à Binaire(2)*10 et retourne 10*10=100
Fait appel à Binaire(5)*10 et retourne 100*10=1000
Fait appel à Binaire(10)*10 et retourne 1000*10=10000
Fait appel à Binaire(21)*10 et retourne 10000*10=10000
Etape 3 Chouette ! On a pu décaler le 1 à
gauche mais le résultat est à côté de la plaque …
Que faire?› Ici il faut remarquer une nouvelle
caractéristique (pour la découvrir il faut tester sur votre brouillon la conversion de plusieurs nombres pour pouvoir la détecter)
Etape 3 Remarquez le lien entre 4DIV2=2 et 4
› 10 et 100 (10*10=100) Remarquez le lien entre 8DIV2=4 et 8
› 100 et 1000 (100*10=1000) Remarquez le lien entre 16DIV2=8 et 16
› 1000 et 10000 (1000*10=10000)
› On peut dire que si j’ai le nombre binaire d’un nombre entier pair alors il suffit de le multiplier par 10 pour trouver le nombre binaire de son double
Etape 3 Remarquez le lien entre 5DIV2=2 et 5
› 10 et 101 (10*10 +1 =101) Remarquez le lien entre 7DIV2=3 et 7
› 11 et 111 (11*10+1=111) Remarquez le lien entre 9DIV2=4 et 9
› 100 et 1001 (100*10+1=1001)
› On peut dire que si j’ai le nombre binaire d’un nombre entier impair, il faut prendre le nombre binaire du quotient de sa division par 2 le multiplier par 10 et le rajouter 1
Ainsi La forme finale de notre méthode est :int Binaire (int nbre_a_convertir){ if(nbre_a_convertir / 2 == 0) return nbre_a_convertir % 2; else if (n % 2 == 0) // n est pair
return Binaire(nbre_a_convertir/2)*10; else return Binaire(nbre_a_convertir/2)*10+1; }
elsereturn Binaire(nbre_a_convertir/2);
}
Fin =) Übung macht den Meister !
› En s’exerçant on devient « maître »› Pour comprendre la récursivité, défiez-vous
avec plusieurs exercices › Bon courage!