Partage
  • Partager sur Facebook
  • Partager sur Twitter

Un code dont je ne comprend pourquoi il ait ce qu'il fait

C'est pas claire comme titre? ^^

Sujet résolu
    25 janvier 2006 à 20:59:51

    salut salut,
    j'ai un peu regarde le site france ioi pour les cours de C++, et on propose a un moment le code :
    #include <stdio.h>

    void debut_fin(int nb_affichages)
    {
       printf("début %d\n", nb_affichages);
       if (nb_affichages > 1)
          debut_fin(nb_affichages - 1);
       printf("fin %d\n", nb_affichages);
    }

    int main()
    {
       debut_fin(3);
       return 0;
    }

    ce code affiche:

    debut 3
    debut 2
    debut 1
    fin 1
    fin 2
    fin 3

    donc jusqu'a fin 1", aucun probleme, mais ensuite, je ne comprend absolument pas pourquoi la boucle reprend (alors que je ne voie aucune instruction qui lui demande), et pourquoi quand cette fonction reviens (alors qu'on ne lui a pas demande ^^ ), la valeur de nb_affichages remonte... Et ca m'ennerve de ne pas comprendre :colere:
    Alors si quelqu'un pourrrait m'eclairer, merci d'avance!
    • Partager sur Facebook
    • Partager sur Twitter
      25 janvier 2006 à 21:04:44

      Tu prends un crayon, un bout de papier et tu écris la valeur des arguments à chaque appel et tu suis l'ordre d'exécution en servant d'interpréteur C pour ton programme. Tu devrais comprendre.
      • Partager sur Facebook
      • Partager sur Twitter
        25 janvier 2006 à 21:22:04

        Effectivement la meilleure chose à faire dans ces cas là, c'est d'imaginer que t'es à la place de l'ordinateur, et de faire les manips en suivant le code source ligne à ligne (et pour la mémoire, une feuille et un stylo c'est bien).

        On pourrait aussi expliquer ce qui se passe en clair, mais c'est franchement moins formateur.
        • Partager sur Facebook
        • Partager sur Twitter
          25 janvier 2006 à 21:33:19

          Citation : rz0

          Tu prends un crayon, un bout de papier et tu écris la valeur des arguments à chaque appel et tu suis l'ordre d'exécution en servant d'interpréteur C pour ton programme. Tu devrais comprendre.


          Citation : bluestorm


          Effectivement la meilleure chose à faire dans ces cas là, c'est d'imaginer que t'es à la place de l'ordinateur, et de faire les manips en suivant le code source ligne à ligne (et pour la mémoire, une feuille et un stylo c'est bien).

          On pourrait aussi expliquer ce qui se passe en clair, mais c'est franchement moins formateur.


          Croyez moi, je n'aurai pas poste un message sur ce forum si je n'avais pas reflechit a ce truc pendant une semaine (bon ok p'tet un peu moins ^^ ), j'ai bien regarde, mais y a un truc qu ije n'arrive vraiment pas a piger:
          arriver au premier
          printf("fin %d\n", nb_affichages);
          donc quand il affiche "fin 1", je ne vois pas du tout pourquoi la fonction ne s'arrete pas ici, et qu'on arrive pas au return 0 de main, mais qu'au lieu de ca, on reparte pour deux tours de fonction debut_fin, et que nb_affichage est incremente de 1 a chaque fois...
          faut croire que j'en tiens une sacree couche, mais je n'arrive VRAIMENT pas a comprendre... :euh:
          • Partager sur Facebook
          • Partager sur Twitter
            25 janvier 2006 à 21:34:26

            Citation : M@kss

            salut salut,
            j'ai un peu regarde le site france ioi pour les cours de C++, et on propose a un moment le code :

            #include <stdio.h>

            void debut_fin(int nb_affichages)
            {
               printf("début %d\n", nb_affichages);
               if (nb_affichages > 1)
                  debut_fin(nb_affichages - 1);
               printf("fin %d\n", nb_affichages);
            }

            int main()
            {
               debut_fin(3);
               return 0;
            }


            ce code affiche:

            debut 3
            debut 2
            debut 1
            fin 1
            fin 2
            fin 3

            donc jusqu'a fin 1", aucun probleme, mais ensuite, je ne comprend absolument pas pourquoi la boucle reprend (alors que je ne voie aucune instruction qui lui demande), et pourquoi quand cette fonction reviens (alors qu'on ne lui a pas demande ^^ ), la valeur de nb_affichages remonte... Et ca m'ennerve de ne pas comprendre :colere:
            Alors si quelqu'un pourrrait m'eclairer, merci d'avance!

            Bah c'est simple,


            if (nb_affichages > 1)
                  debut_fin(nb_affichages - 1);
               printf("fin %d\n", nb_affichages);

            debut_fin est rappellé, mais après, c'est la suite du code soit printf("fin..."); qui est appellé 3 fois de suite et de manière décroissante car... Ben fait le à la main comme des personnes l'ont dit ;)

            La chose où tu as bloqué à mon avis c'est que tu as dû penser que la suite du code ne s'executerai pas si debut_fin était rappellé, or c'est faux :)
            • Partager sur Facebook
            • Partager sur Twitter
              25 janvier 2006 à 22:00:44

              Salut!
              en fait, si tu le fais à la main tu comprends^^
              #include <stdio.h>

              void debut_fin(int nb_affichages)
              {
                 printf("début %d\n", nb_affichages);
                 if (nb_affichages > 1)
                    debut_fin(nb_affichages - 1);
                 printf("fin %d\n", nb_affichages);
              }

              int main()
              {
                 debut_fin(3);
                 return 0;
              }


              ce qui nous pose problème, c'est la fonction:

              void debut_fin(int nb_affichages)
              {
                 printf("début %d\n", nb_affichages);
                 if (nb_affichages > 1)
                    debut_fin(nb_affichages - 1);
                 printf("fin %d\n", nb_affichages);
              }

              bin regarde, la réponse se trouve à cette ligne:

              if (nb_affichages > 1)
                    debut_fin(nb_affichages - 1);


              tu vois qu'on fait appel à la fonction!
              donc en gros on a une fonction dans une fonction.
              Alors quand l'ordi lit la fonction pour la 1ere fois, il tombe sur la ligne:
              debut_fin(nb_affichages - 1);

              donc il rerentre dans la fonction, puis il relit et retombe sur la fonction et etc., donc dans le main on a pleins de fois:
              printf("début %d\n", nb_affichages);

              Et ce, jusqu'à que la condition (if (nb_affichages > 1)) soit terminé.
              si la condition n'est plus vraie, et bin on ne lit plus la fonction!
              donc on s'arête, et on lit la ligne suivante:
              printf("fin %d\n", nb_affichages);

              puis on sort de la fonction.
              Heureusement qu'on s'arête sinon, on aurait une infinité de :

              printf("début %d\n", nb_affichages);


              Voilà, j'espère que t'as compris :D
              • Partager sur Facebook
              • Partager sur Twitter
                25 janvier 2006 à 22:06:49

                En fait ceci s'appelle (j'espère que ça n'a pas déjà été dit) la récurcivité. Tu appelles ta fonction de manière récursive c'est à dire que tu la rappelles à chaque fois. Exemple :


                void recur(int profondeur)
                {
                    if (profondeur > 1) {
                        printf("Nous en sommes a %ld",profondeur)
                        recur(profondeur - 1);
                    }
                }
                • Partager sur Facebook
                • Partager sur Twitter
                  25 janvier 2006 à 22:13:00

                  Haaaaaaaaaaaaaaaaaaaa
                  Ca y'est !!! enfin, ouf :-°
                  en fait je n'avais pas tenu compte de la recursivite en effet (ce qui est totalement debile, puisque cet exemple est fait pour illustrer la recursivite dans ce cours :p ), ok donc on peut dire que a chaque nouveau
                  printf("début %d\n", nb_affichages);
                  on rentre dans une nouvelle fonction, et a chaque nouveau
                  printf("fin %d\n", nb_affichages)
                  on sort de la fonction precedante, et on a donc une valeur inferieur! d'accord d'accord
                  ben j'aurai mis le temps :p
                  En tout cas merci de m'avoir aide!
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Un code dont je ne comprend pourquoi il ait ce qu'il fait

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown