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 :

double récursivité probabilité


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Homme Profil pro
    Software engineer
    Inscrit en
    Août 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Software engineer

    Informations forums :
    Inscription : Août 2006
    Messages : 73
    Par défaut double récursivité probabilité
    Bonjour,

    J'ai besoin d'écrire un petit programme de probabilité.
    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    #include <stdio.h>
     
    #define M 10
     
    float pr(int j, int n)
    {
       float r = 0.0f;
     
       if (j > n || j == 0)
       {
          r = 0;
       }
       else if (j == 1 && n == 1)
       {
          r = 1;
       }
       else
       {
          r = ((j/M) * pr(j, n - 1) + (1 - (j - 1)/M) * pr(j - 1, n - 1));
       }
     
       return r; 
    }
     
    int main(void)
    {
       printf ("test : %f\n", pr(2, 3));
     
       return 0;
    }
    Sur papier, l'algorithme semble juste.
    Quand j'exécute le programme, il retourne toujours 0. Il retourne en faite la valeur que je met dans la première condition comme si il "oubliait" de revenir au premier appel et faire l'addition une fois que tout les termes sont "trouvés".

    Pouvez-vous m'aider ?
    Merci d'avance !

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    La division de deux entiers ne fait pas ce que tu as l'air de penser.

  3. #3
    Membre éclairé

    Homme Profil pro
    Software engineer
    Inscrit en
    Août 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Belgique

    Informations professionnelles :
    Activité : Software engineer

    Informations forums :
    Inscription : Août 2006
    Messages : 73
    Par défaut
    Merci beaucoup Jean-Marc ! Je n'ai pas pensé à ça, c'est vrai...
    Comme quoi le repos est important !

  4. #4
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Ce bloc ne sert à rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       if (j > n || j == 0)
       {
          r = 0;
       }
    la variable r est déjà initialisée à 0 peut importe les valeurs de i et j .

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Citation Envoyé par ssmario2 Voir le message
    Ce bloc ne sert à rien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       if (j > n || j == 0)
       {
          r = 0;
       }
    la variable r est déjà initialisée à 0 peut importe les valeurs de i et j .
    Mais l'évalution de la condition est quand même nécessaire, sinon il va tomber dans le cas de figure général en fin de fonction.

    Par contre, il semblerait que le cas où j est négatif ne soit pas pris en compte et, sans être allé plus avant, je ne pense pas que l'algo du cas général soit conçu pour.

  6. #6
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Je n'est pas prêté attention au fait que la fonction soit récursive, désolé

    le test pourrait être déplacé comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    float pr(int j, int n)
    {
    	float r = 0.0f;
     
    	if (j == 1 && n == 1 )
    	{
    		r = 1;
    	}
    	else if( j<=n && j!=0 )
    	{
    		r = ((j/M) * pr(j, n - 1) + (1 - (j - 1)/M) * pr(j - 1, n - 1));
    	}
     
    	return r; 
    }

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

Discussions similaires

  1. [Transac SQL] double récursivité ?
    Par yozart dans le forum Développement
    Réponses: 20
    Dernier message: 22/11/2011, 13h10
  2. récursivité double caml
    Par alix30002000 dans le forum Caml
    Réponses: 8
    Dernier message: 11/10/2007, 16h10
  3. String -> long double (_strlold ?)
    Par haypo dans le forum C
    Réponses: 7
    Dernier message: 25/07/2002, 20h22
  4. Réponses: 3
    Dernier message: 12/06/2002, 21h15

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