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++

  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
    Points : 2
    Points
    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 du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 63
    Points : 60
    Points
    60
    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)
    Birds of a feather flock together

  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
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup, je vais approfondir à partir de ca

  4. #4
    Membre éprouvé
    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
    Points : 1 046
    Points
    1 046
    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 du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 63
    Points : 60
    Points
    60
    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
    Birds of a feather flock together

  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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    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 régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Juin 2002
    Messages : 256
    Points : 121
    Points
    121
    Par défaut
    loulou24 : pourrais tu donner un exemple stp ? ca m'interesse
    OS : WinXP
    Outils : VC++ 8 (Visual Studio 2005)

  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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    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 régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Juin 2002
    Messages : 256
    Points : 121
    Points
    121
    Par défaut
    merci.
    OS : WinXP
    Outils : VC++ 8 (Visual Studio 2005)

  10. #10
    Membre confirmé
    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
    Points : 580
    Points
    580
    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 du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 63
    Points : 60
    Points
    60
    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 ) );
    }
    Birds of a feather flock together

  12. #12
    Membre confirmé
    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
    Points : 580
    Points
    580
    Par défaut
    oui, très juste freddy766 en effet le cas du 1 est géré dans le 'else'.

  13. #13
    Membre du Club

    Inscrit en
    Mai 2003
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 39
    Points : 67
    Points
    67
    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 du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 63
    Points : 60
    Points
    60
    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;
    Birds of a feather flock together

  15. #15
    Membre confirmé
    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
    Points : 580
    Points
    580
    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