NB : Téléchargez la présentation pour voir l’animation
 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
 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!
 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
 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?
 Il faut trouver un lien entre le nombre à
entrer au départ et la condition d’arrêt.
 Dresser l’arbre de dépendance entre les
appels récursifs
Binaire(42)
Binaire(21)
Binaire(10)
Binaire(5)
Binaire(2)
Binaire(1)
 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
 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)
 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);
}
 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
 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
 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
 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)
 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
 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
 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);
}
 Ü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!

Comment retrouver la forme récursive

  • 1.
    NB : Téléchargezla présentation pour voir l’animation
  • 2.
     Ecrire unefonction 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 2102 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 cecas, 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 lapremiè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 fauttrouver un lien entre le nombre à entrer au départ et la condition d’arrêt.
  • 7.
     Dresser l’arbrede dépendance entre les appels récursifs Binaire(42) Binaire(21) Binaire(10) Binaire(5) Binaire(2) Binaire(1)
  • 8.
     Dresser l’arbrede 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 veutdire 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 lanouvelle 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 votremé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 nepas 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’arbrede 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 lelien 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 lelien 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 formefinale 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 machtden Meister ! › En s’exerçant on devient « maître » › Pour comprendre la récursivité, défiez-vous avec plusieurs exercices › Bon courage!