Partage
  • Partager sur Facebook
  • Partager sur Twitter

Récursivité croisée

Sujet résolu
    20 septembre 2017 à 23:26:27

    Bonsoir !

    J'ai essayé de créer 2 fonctions mutuellement récursives pour tester  si le paramètre nb était pair ou impair mais sans succès, à la sortie on me renvoit  "Segmentation fault: 11". Si vous pouvez m'aider à avancer ça serait cool, merci !

    #include <stdio.h>
    
    int pair(int nb); 
    int impair(int nb);
    
    int pair(int nb)
    {
    	int ret = 0;
    
    	if(impair(nb))
    	{
    		ret = 0;
    	}
    
    	else
    	{
    		ret = 1;
    	}
    
    	return ret;
    }
    
    
    int impair(int nb)
    {
    	int ret = 0;
    
    	if(pair(nb))
    	{
    		ret = 1;
    	}
    	else
    	{
    		ret = 0;
    	}
    
    	return ret;
    }
    
    
    int main()
    {
    	int nb = 7;
    	int resultat = 0;
    
    	resultat = pair(nb);
    
    	if(resultat == 1)
    	{
    		printf("%d est pair\n",nb);
    	}
    	else
    	{
    		printf("%d est impair\n",nb);
    	}
    
    	return 0;
    }
    
    
    
    
    
    
    
    


    • Partager sur Facebook
    • Partager sur Twitter
      21 septembre 2017 à 0:15:30

      Tes fonctions s'appellent sans arrêt avec la même valeur de paramètre a chaque fois donc "boucle infini" jusqu'a ce que la pile d'appel de fonction explose...

      une fonction récursive doit

      - avoir une condition d'arret

      - et un appel avec le parametre originel modifié.

      quand on applique cela a ton code on obtient un truc genre:

      int pair(unsigned int nb) // unsigned pour pas avoir a traiter les nombres negatifs
      {
          if(nb == 0)
              return = 1;
      
          return impair(nb-1); nb est pair si nb-1 est impair
      }
       
       
      int impair(unsigned int nb) 
      {
       
          if(nb == 1)
              return = 1;
          if (nb == 0)
              return = 0;
      
         return pair(nb-1); nb est impair si nb-1 est pair
       
      }
      la condition d'arret de pair ne pouvant retourner que vrai, il faut que les conditions d'arret de impair puisse traiter le vrai et le faux.

      (non testé)

      Note que deux fonctions croisées pour tester la parité, c'est vraiment pour l'exemple, car il est mieux de tester le bit de poids faible du nombre en question qui est a zero si celui ci est pair

      int pair(int nb)
      {
         return ((nb & 0x01)==0x0);
      }



      -
      Edité par breizhbugs 21 septembre 2017 à 0:19:18

      • Partager sur Facebook
      • Partager sur Twitter
      ** La doc, c'est comme le PQ: ça sert à se démerder tout seul **
        22 septembre 2017 à 18:51:08

        C'est à dire que, quand même, il faudrait faire un effort pour utiliser le type bool

        #include <stdbool.h>
        
        bool pair(unsigned int n)
        {
           return (n == 0) || impair(n - 1);
        }



        -
        Edité par michelbillaud 22 septembre 2017 à 18:51:39

        • Partager sur Facebook
        • Partager sur Twitter

        Récursivité croisée

        × 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