Partage
  • Partager sur Facebook
  • Partager sur Twitter

recursion simple

Sujet résolu
    18 août 2017 à 8:17:16

    #include <stdio.h>
    
    int ft_recursive_factorial(int nb)
    {
    	if (nb >= 13)
    	return (0);
    	if (nb <= 0)
    	return (1);
    	return (nb * ft_recursive_factorial(nb - 1));
    }
    
    int	main()
    {
    	printf("%d\n", ft_recursive_factorial(8));
    	return (0);
    }

    cette fonction calcule la factorielle de "nb"
    ce que je ne comprends pas c'est que dans ma deuxieme condition si je veux renvoyer 0 au lieu de 1; la fonction me renvoie systématiquement 0;
    je ne comprends pas du tout pourquoi pour traiter les erreurs renvoyer 0 n'es t'il pas la norme ?
    merci de votre aide !
    • Partager sur Facebook
    • Partager sur Twitter
      18 août 2017 à 8:34:01

      Yo!
      Je crois que tu te méprends quelque part sur la factorielle.
      Factorielle(2) = 2*1, Factorielle(3) = 3*2*1, ok.
      Il se passe quoi si jamais tu rajoutes 0 la dedans?
      Factorielle(2) = 2*1*0? Factorielle(3) = 3*2*1*0?

      C'est ça que tu essaies de faire en retournant 0.

      -
      Edité par KirbXCoucou 18 août 2017 à 8:36:39

      • Partager sur Facebook
      • Partager sur Twitter

      « Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
      D. Mendeleïev

      Anonyme
        18 août 2017 à 8:42:16

        Facile !

        Si tu renvois 0 lors de ta deuxième condition tu auras toujours 0 parce que tu vas utiliser ta fonction en réduisant nb à chaque fois, du coup à un moment tu auras nb=-1 et ta fonction va renvoyer 0. Or ton résultat est le produit des resultats successifs de la fonction, donc si UN SEUL des résultats est 0, tu sais que 0*x*c*....*a=0

        -
        Edité par Anonyme 18 août 2017 à 8:42:42

        • Partager sur Facebook
        • Partager sur Twitter
          18 août 2017 à 8:48:38

          PitchPitch a écrit:

          Facile !

          Si tu renvois 0 lors de ta deuxième condition tu auras toujours 0 parce que tu vas utiliser ta fonction en réduisant nb à chaque fois, du coup à un moment tu auras nb=-1 et ta fonction va renvoyer 0. Or ton résultat est le produit des resultats successifs de la fonction, donc si UN SEUL des résultats est 0, tu sais que 0*x*c*....*a=0

          -
          Edité par PitchPitch il y a moins de 30s

          C'est juste, sauf que nb n'arrivera jamais à -1, il se stoppera à 0, dû à la condition "<=", mais ta fonction va bien renvoyer 0 :)

          Edit : Et ne dis pas "facile" quand tu réponds a quelqu'un, c'est peut-être évident pour toi, mais pas pour les autres, sinon, ils ne poseraient pas la question :)

          -
          Edité par KirbXCoucou 18 août 2017 à 8:49:44

          • Partager sur Facebook
          • Partager sur Twitter

          « Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
          D. Mendeleïev

            18 août 2017 à 10:56:18

            "je ne comprends pas du tout pourquoi pour traiter les erreurs renvoyer 0 n'es t'il pas la norme ?"

            Non, aucune norme ne définit la valeur retournée par une fonction.

            De plus 0 ne signifie pas forcément erreur: la preuve, ton "return 0;" en fin de programme qui signifie normalement que tout s'est bien passé.


            • Partager sur Facebook
            • Partager sur Twitter
              18 août 2017 à 12:16:41

              Bonjour,

              Question de style : pourquoi des parenthèses avec les "return"?

              Pourquoi renvoyer 0 si le nombre passé en paramètre est supérieur ou égal à 13?

              Pour la gestion d'erreur, tu peux soit affecter une valeur à ERRNO (cf. doc et internet), et la fonction appelante se charge de vérifier un éventuel code d'erreur; soit passer un pointeur sur une variable résultat en paramètre, et retourner un code d'erreur (ou de succès).

              Hector;

              -
              Edité par vimescape 18 août 2017 à 12:17:37

              • Partager sur Facebook
              • Partager sur Twitter
                18 août 2017 à 12:30:18

                Hello,

                HectorDenis a écrit:

                Question de style : pourquoi des parenthèses avec les "return"?

                Juste pour info: dans la première version du K&R, qui m'a servi à débuter en C (il y a longtemps, windows n'existait pas), la valeur renvoyée par un return est entre parenthèses dans tous les exemples. Dans mon cas, il est compréhensible que j'ai gardé cette habitude, mais pour kindboy, j'ai comme un doute :lol:

                -
                Edité par edgarjacobs 18 août 2017 à 12:31:17

                • Partager sur Facebook
                • Partager sur Twitter

                On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                  18 août 2017 à 12:51:11

                  HectorDenis a écrit:

                  Pourquoi renvoyer 0 si le nombre passé en paramètre est supérieur ou égal à 13?


                  Probablement parce qu'il dépasse la capacité d'un int (pour des int codés sur 32 bits).
                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 août 2017 à 14:04:26

                    Nan, même pas :
                    Un maxInt 32Bits c'est 2,147,483,647

                     Avec 14, on obtient 87 178 291 200* (Merci Rouloude)

                    -
                    Edité par KirbXCoucou 21 août 2017 à 8:54:48

                    • Partager sur Facebook
                    • Partager sur Twitter

                    « Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
                    D. Mendeleïev

                      18 août 2017 à 23:53:12

                      KirbXCoucou a écrit:

                       Avec 14, on obtient 1,278,945,280 

                      Tu es bien sur que ton résultat est bon ? Moi je crois bien que tu as déjà passé la capacité d'un entier sur 32 bits !

                      Pour info avec 14 tu devrais avoir 87 178 291 200

                      • Partager sur Facebook
                      • Partager sur Twitter
                        19 août 2017 à 9:19:24

                        La capacité d'un entier 32bits est bien dépassée avec 14!.

                        http://www.cplusplus.com/reference/cerrno/errno/

                        N'empêche, il faudrait utiliser ERANGE.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          21 août 2017 à 8:54:20

                          Ahah, effectivement, c'est faux x) Je sais pas comment j'ai réussi à avoir ce résultat ... x)
                          • Partager sur Facebook
                          • Partager sur Twitter

                          « Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
                          D. Mendeleïev

                          recursion simple

                          × 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