[C]Fonction récursive

Fermé
bel3ataryah - 8 nov. 2010 à 23:53
 bel3ataryah - 14 nov. 2010 à 11:18
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??

7 réponses

loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
9 nov. 2010 à 01:40
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
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 dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
9 nov. 2010 à 22:42
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 vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
10 nov. 2010 à 08:18
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 841
10 nov. 2010 à 08:27
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
10 nov. 2010 à 22:11
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 dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
Modifié par loupius le 11/11/2010 à 23:19
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
14 nov. 2010 à 11:18
Trop fort,
j'ai fini par comprendre là
merci tout le monde
0