2. 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
3. Soit:
42 2
210 2
1 10
0
2
5
1
2
2 2
21
0
1 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!
4. 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
2
2 2
21
0
1 0
5. 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?
6. Il faut trouver un lien entre le nombre à
entrer au départ et la condition d’arrêt.
7. Dresser l’arbre de dépendance entre les
appels récursifs
Binaire(42)
Binaire(21)
Binaire(10)
Binaire(5)
Binaire(2)
Binaire(1)
8. Dresser l’arbre de dépendance entre les
appels récursifs
Binaire(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
9. 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)
10. Ainsi la nouvelle forme de la méthode
récursive est
int Binaire (int nbre_a_convertir){
if(nbre_a_convertir / 2 == 0)
return nbre_a_convertir % 2;
else
return Binaire(nbre_a_convertir/2);
}
11. 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
12. 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
13. Dresser l’arbre de dépendance entre les
appels récursifs
Binaire(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
14. 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)
15. 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
16. 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
17. 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;
}
else
return Binaire(nbre_a_convertir/2);
}
18. Ü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!