[C]Fonction récursive

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

  1. 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
    1. 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
      1. 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
    2. Contributeur
      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
      1. Contributeur
        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
        1. 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
          1. 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
            1. Trop fort,
              j'ai fini par comprendre là
              merci tout le monde
              0