Partage
  • Partager sur Facebook
  • Partager sur Twitter

Phénomène paranormal en c

    15 juillet 2018 à 23:22:11

    Bonjours messieurs zet mesdames,

    Je viens a vous non pas pour obtenir de l'aide sur un programme et pour trouver une solution a un bug mais pour essayer d'avoir une explication a un phénomène que ni moi, ni mes collègues de code n'arrivons à expliquer.

    Écoutez bien ça va aller très vite.

    Pour un exercice, je cherche a afficher le n-ième chiffre de la suite de fibonacci (Si vous ne savez pas ce que c'est, Google vous répondra). Ce chiffre n sera entré en paramètre. Comprenez bien que je ne cherche pas a afficher la suite de Fibonacci jusqu'au chiffre n, mais bien le chiffre n seul.

    Voici mon code, il est fonctionnel. Les "if" servent a conditionner plusieurs consignes de l'exercice.

    Le dixième nombre de la suite de Fibonacci est 55, cela me retourne donc 55. 

    Jusque là, on est bon, je ne vous apprends rien vous etes des experts du code et moi un débutant qui a débuté il y a deux semaines.

    Maintenant, je vais changer le return (index) en return (1) sans changer l'argument qui dit que index = 10. Nous sommes bien d'accord que changer ce retour ne devrait EN RIEN modifier mon retour si index = 10 puisque nous ne remplissons pas les conditions des if, ni modifier mon index en lui-même puisque return n'a jamais et ne fera jamais ça (ou alors jui con et j'ai loupé une étape mais passons).

    Et c'est maintenant que la magie opère, regardez bien.

    Mon programme me renvoie la 11ème valeur de la suite de Fibonacci. Et c'est LA que nous entrons dans un nouvel univers.

    Voilà, donc si quelqu'un a une réponse a ce phénomène, par pitié répondez moi. Cela va bientôt faire 1h30 que je cherchais a débugger mon programme et je suis très énervé que ce soit quelque chose qui pour l'instant N'A AUCUN SENS qui rendait mon programme obsolète.

    Merci de vos réponses.

    Gros bisous

    • Partager sur Facebook
    • Partager sur Twitter
      15 juillet 2018 à 23:37:04

      Hello,

      Ah les fonctions récursives.. pas facile à suivre le chemin étape par étape, en particulier avec Fibonacci où on peut parler de double récursivité.

      GoudDeal a écrit:

      Maintenant, je vais changer le return (index) en return (1) sans changer l'argument qui dit que index = 10. Nous sommes bien d'accord que changer ce retour ne devrait EN RIEN modifier mon retour si index = 10 puisque nous ne remplissons pas les conditions des if, ni modifier mon index en lui-même puisque return n'a jamais et ne fera jamais ça (ou alors jui con et j'ai loupé une étape mais passons).


      Soit tu t'es mal exprimé ici, soit tu n'as visiblement pas compris la récursivité
      Tu dis que ce return ne doit rien modifier puisque ton index de départ est 10. Mais ta fonction se ré-appelle à chaque fois avec des index inférieur : index - 1 et index - 2

      Par conséquent, il arrivera au bout d'un certain temps où index == 1 et tu remplira donc la condition du if.

      Maintenant pourquoi tu obtiens la 11em valeur? Honnetement, je n'ai pas vraiment cherché ça, il faudrait démêler toute la récursivité pas à pas, en testant avec un plus petit index que 10 pour s'y retrouver.

      Par contre dans ton dernier code, j'ai trouvé qu'il peut se passer des choses bizarres, lorsque ton index atteint 0.

      Ta première condition ne se fait pas (0 n'est pas inférieur à 0), la 2em non plus (0 != 1). Donc tu vas reappeler ta fonction fibonacci avec des valeurs négatives.. pas génial. Ton tour en trop vient certainement de là.

      • Partager sur Facebook
      • Partager sur Twitter
        15 juillet 2018 à 23:46:24

        Oui en effet, je l'avais modifié pour tenter le diable avec une troisieme condition. mon code exact est celui la 

        Ensuite pour un index inférieur a 10, le résultat est le même pour toutes les valeurs qu'elles soient supérieures ou inférieures

        -
        Edité par GoudDeal 16 juillet 2018 à 0:39:36

        • Partager sur Facebook
        • Partager sur Twitter
          16 juillet 2018 à 7:35:40

          en fait c'est tout simple, dans to premier cas quand index = 0 tu retournes 0 dans le second quand index = 0 tu retournes 1 c'est de la que vient la différence.

          #include <stdio.h>
          
          int ft ( unsigned int index )
          {
          	printf ( "	index : %d\n", index );
          	if ( index == 1 )
          		return ( 1 );
          	if ( index == 0 )
          		return ( 0 );
          	return( ft(index -1) + ft(index -2) );
          }
          
          int main ( void )
          {
          	printf ( "%d\n", ft ( 10 ) );
          	return ( 0 );
          }
          

          de plus tu peux supprimer un test en mettant le bon type en paramètre pour index ( un unsigned )

          -
          Edité par ox223252 16 juillet 2018 à 7:37:18

          • Partager sur Facebook
          • Partager sur Twitter

          la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

          Mon GitHub

            16 juillet 2018 à 12:57:01

            ox223252 a écrit:

            de plus tu peux supprimer un test en mettant le bon type en paramètre pour index ( un unsigned )

            Non, unsigned n'est pas le bon type pour de l'arithmétique.

            • Partager sur Facebook
            • Partager sur Twitter
              16 juillet 2018 à 13:01:21

              unsigned indique seulement que ta valeur sera positive ou nulle, pourquoi cela ne convient pas a l'arithmetique ?
              • Partager sur Facebook
              • Partager sur Twitter
                16 juillet 2018 à 13:22:27

                Marc Mongenet a écrit:

                ox223252 a écrit:

                de plus tu peux supprimer un test en mettant le bon type en paramètre pour index ( un unsigned )

                Non, unsigned n'est pas le bon type pour de l'arithmétique.

                quoi qu'il en soit le reste est vrai ^^
                • Partager sur Facebook
                • Partager sur Twitter

                la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

                Mon GitHub

                Phénomène paranormal en c

                × 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