Langage C / Fonction récursive

Résolu
human -  
 kabboul -
Bonjour à tous,

J'ai un petit ennui avec une fonction récursive. Celle-ci fait appel à elle même un certain nombre de fois et doit s'arrêter lorsque certaines conditions sont vérifiées. Et pour arrêter l'exécution d'une fonction, je ne connais que 2 méthodes : return et exit(0)

L'ennui c'est que dans ces deux cas mon programme s'arrête (avec retour du prompt sous le shell quand j'utilise exit(0)) mais il n'exécute pas ce qu'il doit exécuter après cette fonction !!

Vous avez une autre méthode pour arrêter l'exécution d'une fonction (récursive) et poursuivre les différentes procédures du main ??

Merci de vos réponses

16 réponses

  1. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    le mieux c'est un exemple :
    long int factorielle(long int a)
    {
    if (a==0) return 1;
    return a*factorielle(a-1);
    }
    ici, factorielle est une fonction récursive.
    14
    1. ikram00 Messages postés 17 Statut Membre
       
      s'il vous plait on fait comment l'appel d'une fonction recursive à l'interieur du main()
      ??
      0
    2. oh wiiiii
       
      tu fais: FONCTION RECURSIVE !!!!! , voila et en general elle vient.
      0
    3. DolipranZ
       
      gg nageur :D
      0
    4. PICMAN > ikram00 Messages postés 17 Statut Membre
       
      c'est une fonction comme les autres,
      0
    5. 65
       
      3asbna
      0
  2. brj
     
    ben, on utilise return et pas autre choses une fois return rencontrer tu quite la fonction en cours pour retourner a la fonction qui la appele(la meme dans les cas recursif).

    exit c pour quiter le prog donc normal que tu t retrouve sous le shell.
    Qu c passe t'il avec return?
    5
  3. teebo Messages postés 33585 Date d'inscription   Statut Contributeur Dernière intervention   1 797
     
    Tu ne peux pas "niquer" tous les appels recursifs, a moins de cracher ton programme, ca revient a dire que tu veux empecher le retour a la fonction appelante...

    °,°
    \_/
    3
  4. sirhowarddean Messages postés 2 Statut Membre 5
     
    oui en fait dans fact2(nbr) on appelle encore la fonction fact2(nbr - 1) pour faire le meme traitement avec (nbr - 1) ainsi de suite mais il doit y avoir une condition d arret a l appel de cette fonction sinon ce serait infinie alors.Donc toute fonction recursive a besoin d une condition d arret.Et dans fact2 la condition d arret c est lorsque nbr == 1.
    exemple fact2(4).

    1- fact2(4) = 4 * fact2(3);
    2- fact2(3) = 3 * fact2(2);
    3- fact2(2) = 2 * fact2(1);
    fact2(1) returne 1 alors :

    3- fact2(2) = 2 * 1 = 2;
    2- fact2(3) = 3 * 2 = 6;
    1- fact2(4) = 4 * 6 = 24;

    d ou factorielle 4 vaut bien 24;
    3
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. curtis
     
    hey Human!! si tu nous ecris ce que ta fonction doit fair , alors la on pourra t aider
    tout depend de ce quel va retourné (un booleen, ou un element (un float ou un integer) ou autre )
    car ya des fonction recursive qui utilise une pile cachée
    comme la fct de Char Snipeur: factorielle
    2
  7. sirhowarddean Messages postés 2 Statut Membre 5
     
    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>

    /*Realise par Sir Howard*/

    int fact1(int nbr){
    int f = 1;
    while (nbr > 0){
    f = f * nbr;
    nbr--;
    }
    return f;
    }

    int fact2(int nbr){
    if (nbr == 1)
    return 1;
    else
    return (nbr * fact2(nbr - 1));
    }

    int main(){
    int f;
    do{
    printf("donner le nombre positif dont on doit calculer le factoriel ");
    scanf("%i",&f);
    }
    while (f <= 0);
    printf("la factorielle de %i vaut %i\n",f,fact1(f));

    getchar();
    system("PAUSE");
    return 0;
    }
    2
    1. SSS1 Messages postés 5 Statut Membre
       
      merci bq pour ton aide
      je veux vous poser quelques questions
      ds la deuxieme fonction fact2 ds la derniere ligne return (nbr*FACT1 OU FACT2???????)
      0
    2. SSS1 Messages postés 5 Statut Membre
       
      svp ds la fonction fact1
      on peux aussi utiliser la boucle for n'est ce pas?


      int fact1(int nbr)
      { int f=1;
      for (i=0;i<nbr;i++)
      f=f*(nbr-i);
      return f;
      }
      svp c just ou non j'ai besoin de vos reponses merci
      0
    3. SSS1 Messages postés 5 Statut Membre
       
      et si j' ai bien compris qu'une fonction recursive consiste a introduire ou faire appel a une autre fonction ds la 1ere
      est ce que g bien compris?
      0
    4. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
       
      1 et 3- oui, c'est bien fact2, récurssive, veux dire que tu rappel la même fonction.
      2- : dans fact1, on peut aussi tuiliser une boucle for en effet, ton exemple est bon, mais tu peux aussi faire:
      int f=nbr;for(int i=nbr-1;i>1;i--)f=f*i;
      0
    5. none
       
      ton do while est faux
      0
  8. Doctor C Messages postés 630 Date d'inscription   Statut Membre Dernière intervention   400
     
    human,

    si tu veux sauter par-dessus tous les appels récursifs de ta fonction, c'est que tu n'as pas compris l'essence même d'une fonction récursive. Si ta fonction récursive était faite correctement, la récursivité de ta fonction se chargerais naturellement de terminer chacune des fonctions récursives déjà déclenchées.

    Si tu pouvais mettre ta fonction récursive, ou un fragment de cette dernière, ça pourrait nous aider à solutionner ton problème.
    1
  9. Dren413
     
    int fact(int n){return (n==0) ? 1 : fact(n-1)*n;}

    :)
    1
  10. Human
     
    Le return arrête le programme (i.e. celui-ci ne fait plus rien) et le prompt ne réapparait pas (je dois faire ctrl+c).

    Je pensais qu'il y aurait peut-être une instruction permettant de quitter la fonction et de niquer tous les appels récursifs précédents...
    0
  11. SSS1 Messages postés 5 Statut Membre
     
    g un petit exercice et svp si vous pouvez me donner la reponse
    exercice:
    ecrire une fonction non recursive qui calcule et retourne la factorielle de l'entier passe en argument
    ecrire une autre fonction recursive qui calcule et retourne la factorielle de l'entier passe en argument
    j'attend vos reponses
    merci
    0
  12. SSS1 Messages postés 5 Statut Membre
     
    svp j'ai besoin d'une reponse tres vite c urgen je passe bientot un exam
    -1
  13. brj
     
    non je pense que si tu recupere pas la main c une boucle infini, certain return ne doivent pas etre execute ta pas un peu de code parce que comme sa pour t'aider c pas evident!!
    -2
  14. Belhauss
     
    héhé ta esseyer break; mai elle fau etre conditioner par un if() si nn elle va sortir tt le temps
    -4
  15. amine
     
    j'ai pas compris c'koi la fonction récursive en language c
    -4
    1. ikram00 Messages postés 17 Statut Membre
       
      c'est une fonction qui fait appel à elle même un certain nombre de fois et doit s'arrêter lorsque certaines conditions sont vérifiées.
      0