IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Fonctions


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 2
    Par défaut Fonctions
    Salut à tous,
    Voilà j'essaye de comprendre un peu la programmation, et oui je débute...
    Pour çà j'ai lu pas mal de tutos du site et des bouquins et maintenant j'essaye de faire quelques exercices.
    Cependant je bloque complétement sur un.
    J'explique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Considérons la fonction factorielle présentée dans votre cours (bouquin).
    Cette fonction peut s'écrire en C++ de la manière suivante:
    int factorielle( int n )
    {
       if( n == 1 )
          return 1;
       else
          return ( n * factorielle ( n - 1 ) );
    }
     
    1) Expliquez comment s'effectue le traitement de la fonctorielle de 5 à partir de la fonction précédente.
    2) Quel est le résultat obtenu ?
    Si des personnes arrivaients à bien m'éclairer sur cet exercice pour que je puisse approfondir dans la compréhension de l'exercice.
    Merci d'avance
    PS: Je veut pas de réponses, ce serait trop facile, juste un éclaircissement ou un début d'expliquation.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 63
    Par défaut
    1/ Pour 5 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int factorielle( int n )
    {
       if( n == 1 )
          return 1;
       else
          return ( n * factorielle ( n - 1 ) );
    }
    resultat = 5*fact(4*(fact(3*(fact(2*fact(1))))

    2/ ce qui te donne 5*4*3*2*1=120

    C'est ce que l'on appelle une fonction Recursive (qui s'appelle elle meme)

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 2
    Par défaut
    Merci beaucoup, je vais approfondir à partir de ca

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    Juste pour apporter mon grain de sel : effectivement c'est une fonction récursive, mais ta maniere de la "deplier" freddy766 est completement fause je pense.

    je cite : "resultat = 5*fact(4*(fact(3*(fact(2*fact(1))))"

    ne donne pas du tout 5*4*3*2*1 .

    A mon avis tu ne déplies pas une fonction récursive aussi simplement que ça, mais bon je chipote on a tous compris ce que tu voulais dire .

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 63
    Par défaut
    Effectivement, si tu veux etre plus pointilleux, voila ce que cela te donne :

    fact(5)= 5 * fact(5-1) <=> 5 * fact(4)

    fact(4)= 4 * fact(4-1) <=> 4 * fact(3)

    fact(3)= 3 * fact(3-1) <=> 3 * fact(2)

    fact(2)= 2 * fact(2-1) <=> 2 * fact(1) <=> 2 * 1
    du à d'ou a la fin :
    fact(5) = 5 * (fact(4))
    = 5 * (4 * fact(3))
    = 5 * 4 * (3 * fact(2))
    = 5 * 4 * 3 * (2 * fact(1))
    = 5 * 4 * 3 * 2 * (1)
    = 120

    Don't forget "TAG" RéSOLU

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Concernant la fonction en elle-même, elle oublie le cas n = 0 (0! = 1), et si tu ne prends pas des entiers non-signés en paramètre tu vas te retrouver avec des récursions infinies pour les nombres négatifs.

    [hors-sujet]
    Truc fun : en C++ on peut écrire la factorielle de sorte qu'elle soit calculée par le compilo, donc avant l'execution du programme
    [/hors-sujet]

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Juin 2002
    Messages : 256
    Par défaut
    loulou24 : pourrais tu donner un exemple stp ? ca m'interesse

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    template <int N> struct Fact
    {
        enum {Value = N * Fact<N - 1>::Value};
    };
    template <> struct Fact<0>
    {
        enum {Value = 1};
    };
    template <> struct Fact<1>
    {
        enum {Value = 1};
    };
     
    int x = Fact<5>::Value;
    Et on peut faire pareil pour un certain nombres de formules calculables récursivement.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Juin 2002
    Messages : 256
    Par défaut
    merci.

  10. #10
    Membre chevronné
    Avatar de Petogaz
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 479
    Par défaut
    salut,
    en reprennant le prog de GroSbiLL il suffit de rajouter un ou exclusif pour la valeur 0 comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int factorielle( int n ) 
    { 
       if(( n == 1 )||(n == 0)) 
          return 1; 
       else 
          return ( n * factorielle ( n - 1 ) ); 
    }
    et c'est tout.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 63
    Par défaut
    En fait, il te suffit simplement de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int factorielle( int n )
    {
       if(n == 0)
          return 1;
       else
          return ( n * factorielle ( n - 1 ) );
    }

  12. #12
    Membre chevronné
    Avatar de Petogaz
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 479
    Par défaut
    oui, très juste freddy766 en effet le cas du 1 est géré dans le 'else'.

  13. #13
    Membre confirmé

    Inscrit en
    Mai 2003
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 39
    Par défaut
    Et le cas du 0 ?
    Vu que 0! = 1, ce code est inexact, et pire, il risque à coup sur de faire exploser la pile...

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 63
    Par défaut
    2 reponses auparavant, tu peux voir que le cas de 0 est traité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if(n == 0)  return 1;

  15. #15
    Membre chevronné
    Avatar de Petogaz
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    479
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 479
    Par défaut
    je pense qu'il faut lire thread jusqu'au bout avant de se précipiter à répondre.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Fonction API
    Par margilb dans le forum C++Builder
    Réponses: 2
    Dernier message: 08/07/2002, 11h11
  3. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19
  4. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24
  5. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo