[C]Fonction récursive

bel3ataryah -  
 bel3ataryah -
Bonjour,
je cherchais un programme qui convertit un nombre décimal en binaire et j'ai trouvé le code suivant:

#include<stdio.h>
void showbits(int h)
{
if(h==1)
printf("%d",h);
else
{
showbits(h/2);
printf("%d",h%2);
}
}


void main()
{
int nu;
void showbits(int h);

printf("Num?");scanf("%d",&nu);
printf("\nBin eq of %d is ",nu);
showbits(nu);
printf("\n");
}


Mon problème est que je ne comprends pas comment ça se fait que la fonction n'affiche pas le binaire en inverse.
Quelqu'un pourrait m'expliquer ce code SVP??
A voir également:

7 réponses

loupius Messages postés 697 Date d'inscription   Statut Membre Dernière intervention   148
 
Je ne vois pas pour quelle raison ce code ne fonctionnerait pas.
Il m'a l'air classique et correct ... sauf évidemment si on rentre '0' ou un nombre négatif -> dépassement de pile assuré.
Bonne continuation.
0
bel3ataryah
 
Je n'ai pas dit qu'il ne marche pas.
C'est juste que je ne comprends pas comment il se fait qu'il marche.
0
loupius Messages postés 697 Date d'inscription   Statut Membre Dernière intervention   148
 
C'est simple, la démarche en base 2 est la même que celle en base 10.
Le même code en base 10:
void show10(int h)
{
  if (h<10)
    printf("%d", h);
  else
  {
    show10(h/10);
    printf("%d", h%10);
  }
}
Bonne réflexion.
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Salut.
C'est marrant, en lisant ton code, je me faisais la même réflexion : "ça affiche à l'envers".
Mais si tu réfléchis, tu te rends compte que plus tu divises un nombre plus tu conserve les valeurs élevés (enfin, tu vois). Donc, l'affichage se fait bien dans le bon sens.
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Ca affiche à l'endroit car tu as mis :
showbits(h/2);
printf("%d",h%2);

L'affichage a lieu après la récursion. Si t'avais mis le printf avant, cela aurait bien affiché à l'envers.

Cdlt,
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bel3ataryah
 
Je ne comprends toujours pas,

je prends l'exemple de 8:
- dans main on appelle showbits(8)
- 8 est différent de 1 alors on passe au else qui appelle showbits(4)
- 4 est différent de 1 alors on passe au else qui appelle showbits(2)
- 2 est différent de 1 alors on passe au else qui appelle showbits(1)
- 1==1 on affiche 1

????
Je suis perdu
0
loupius Messages postés 697 Date d'inscription   Statut Membre Dernière intervention   148
 
J'avais mal compris ce que signifiait "affichage du binaire en inverse"; je pensais qu'il s'agissait d'affichage de '1' au lieu de '0' et inversement.
Comme si bien indiqué par mes deux prédécesseurs, l'affichage à lieu après la récursion; il suffit de suivre. Si on prend ton exemple:
- dans main on appelle showbits(8)  
  - dans showbits: 8 != 1 -> else qui appelle showbits(4)  
    - dans showbits: 4 != 1 -> else qui appelle showbits(2)  
      - dans showbits: 2 != 1 -> else qui appelle showbits(1)  
        - dans showbits: 1 == 1 -> qui affiche 1  
      - retour de showbits(1) -> qui affiche 0  
    - retour de showbits(2) -> qui affiche 0  
  - retour de showbits(4) -> qui affiche 0  
- retour de showbits(8) -> on est dans le 'main.  
RESULTAT: 1 0 0 0
Bonne réfexion.
0
bel3ataryah
 
Trop fort,
j'ai fini par comprendre là
merci tout le monde
0