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...
 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 é...
 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_conver...
 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)
Binai...
 Dresser l’arbre de dépendance entre les
appels récursifs
Binaire(42)
Binaire(21)
Binaire(10)
Binaire(5)
Binaire(2)
Binai...
 Ca veut dire
Binaire(42)
Binaire(21)
Binaire(10)
Binaire(5)
Binaire(2)
Binaire(1) Retourne 1 : le reste
Fait appel à Bin...
 Ainsi la nouvelle forme de la méthode
récursive est
int Binaire (int nbre_a_convertir){
if(nbre_a_convertir / 2 == 0)
re...
 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, n...
 Pour ne pas les perdre, on suggère de
multiplier par 10 l’appel récursif
 Pourquoi?
› On remarque que le premier nombre...
 Dresser l’arbre de dépendance entre les
appels récursifs
Binaire(42)
Binaire(21)
Binaire(10)
Binaire(5)
Binaire(2)
Binai...
 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...
 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*1...
 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*...
 La forme finale de notre méthode est :
int Binaire (int nbre_a_convertir){
if(nbre_a_convertir / 2 == 0)
return nbre_a_c...
 Übung macht den Meister !
› En s’exerçant on devient « maître »
› Pour comprendre la récursivité, défiez-vous avec
plusi...
Prochain SlideShare
Chargement dans…5
×

Comment retrouver la forme récursive

248 vues

Publié le

Un petit exercice pour montrer comment peut-on élaborer une forme récursive d'un problème donné

Publié dans : Ingénierie
0 commentaire
1 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
248
Sur SlideShare
0
Issues des intégrations
0
Intégrations
25
Actions
Partages
0
Téléchargements
14
Commentaires
0
J’aime
1
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Comment retrouver la forme récursive

  1. 1. NB : Téléchargez la présentation pour voir l’animation
  2. 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. 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. 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. 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. 6.  Il faut trouver un lien entre le nombre à entrer au départ et la condition d’arrêt.
  7. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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!

×