6
votes

"Récursive sur tous les chemins de commande" Erreur lors de la mise en œuvre de la fonction factorielle

Pour la classe, j'ai une mission:

Écrivez un programme C ++ qui générera le nombre de méthodes distinctes dans lesquelles vous pouvez choisir des objets k d'un ensemble d'objets n ( n < / code> et k doit être des entiers positifs). Ce numéro est donné par la formule suivante:

c (n, k) = n! / (k! * (n-k)!)

Votre programme doit utiliser deux fonctions de retour de valeur. Le premier devrait être appelé factorial et doit renvoyer n! . La deuxième fonction doit être appelée combinaisons et doit renvoyer n! / (K! * (N-k)!). Testez votre programme pour différentes valeurs de n et k cinq fois (boucle contrôlée par le nombre).

J'ai proposé une solution: xxx

... mais je continue à obtenir une erreur, dit;

"" factorielle ": récursif sur tous les chemins de commande, la fonction entraînera un débordement de pile d'exécution;"

Si quelqu'un pouvait m'aider, je travaille dessus pendant environ une heure et je suis exclu!


6 commentaires

Il s'agit maintenant d'un représentant facile pour tous ceux qui ont traversé la mise en œuvre factorielle trcuration;)


Au moins sur Visual Studio, c'est par défaut qu'un avertissement, pas une erreur. Vous êtes libre de l'ignorer et de la compiler de toute façon, bien que la fonction provoque un débordement de pile d'exécution. Ceci est tout à fait pertinent; Si vous essayez de comprendre un tel avertissement, collez-vous d'un point d'arrêt dans votre fonction récursive et de progresser dans le programme peut être instructif.


Le titre de la question est vraiment mauvais. La question a peu à voir avec les numéros de sortie et l'aide est ennuyeuse et un peu offensante. Nous savons que vous voulez de l'aide et "aide!" Il semble que vous ayez une sorte de réclamation morale à ce sujet (comme si vous vous noyiez ou quelque chose).


Lol, je vais garder ça à l'esprit David. C'est tout nouveau pour moi, quel serait un nom propre pour cela?


@ Stephenson024: Quelque chose comme "problème avec la récursion" ou "message d'avertissement de récursivité". Le problème que vous rencontrez est avec la récursion, pas la sortie.


Ok, merci David je l'apprécie beaucoup. Prends soin.


6 Réponses :


17
votes

Il existe deux éléments critiques à une fonction de fonction récursive:

  • Un appel récursif à lui-même
  • A condition de terminaison

    Vous semblez manquer à la condition de terminaison. Comment factorial () quitterait-il pour toujours?


0 commentaires

2
votes

Vous avez défini une fonction récursive (c'est-à-dire essentiellement une fonction qui s'appelle elle-même), mais vous n'avez pas défini de condition de sortie. Vous appelez factorial code> à nouveau juste avant le retour, la fonction ne finira donc jamais, appelant encore et encore.

Vous devez ajouter une branche là-bas, c'est-à-dire P>

if (set_number == 0)
{
   return 1;
}
else
   return set_number * factorial(set_number - 1);


0 commentaires

0
votes

Cette fonction entraînera une récursion infinitive car elle ne cesse jamais de s'appeler:

int factorial(int n)
 {
  if (n<=1)
    return(1);
  else
    n=n*factorial(n-1);
    return(n);
 }


1 commentaires

Pour un tel problème de début, il serait probablement plus facile sur le OP si vous avez conservé votre correctif aussi proche que possible du code existant. En outre, l'indentation sur retour (n); rend votre code douloureux à lire.



1
votes

Vous manquez un cas de base. Factorial devrait renvoyer 1 pour set_number <= 1


0 commentaires

0
votes

Votre fonction factorielle ne se termine pas sur un, elle vient de recouvrer indéfiniment.

int factorial(int set_number)
{
    if (set_number <= 1)
        return 1;
    return set_number * factorial(set_number - 1);
}


1 commentaires

Votre programme a un bogue. 0! == 1 .



0
votes
int factorial(int set_number)
{   
   return set_number == 1?1:set_number * factorial(set_number - 1);
}

0 commentaires