Factorielle d'un nombre utilisant la récursivité

J'ai la fonction récursive ci-dessous pour calculer factorielle d'un nombre. Le programme fonctionne bien sauf lorsque je supprime la condition if. Quelqu'un peut-il expliquer pourquoi?

Ceci est le code qui fonctionne bien -

public static long factUsingRecursion(int number) {
    if (number == 1) {
        return 1;
    } else {
        return number * factUsingRecursion(number - 1);
    }
}

Sans la condition if (code qui renvoie l'erreur),

public static long factUsingRecursion(int number) {
    return number * factUsingRecursion(number - 1);
}

Je reçois l'erreur de débordement de pile.

Exception dans le fil "principal" java.lang.StackOverflowError   à birst.FactorialUsingRecursion.factUsingRecursion (FactorialUsingRecursion.java:10)

Demander à des experts de bien vouloir me dire pourquoi c'est le cas?

0
les longs ne sont pas limités à des nombres positifs. Les ordinateurs feront tout ce que vous leur dites de faire ... donc ce n’est pas comme si la fonction s’arrêtait comme par magie une fois que le nombre est égal à 1. Sans l’instruction if, vous placez fonction après fonction dans la pile sans que les instructions ne puissent toujours revenir et mettre fin à la récursivité. nombre se dirigera vers l'infini négatif jusqu'à ce que la pile déborde
ajouté l'auteur sunrize920, source
Astuce: Sans le si - comment décidez-vous quand arrêter?
ajouté l'auteur cpt. jazz, source
Vous ne pouvez choisir qu'une seule "réponse acceptée" dans une question.
ajouté l'auteur rgettman, source
Toute récursion doit toujours avoir une condition de base pour mettre fin à la récursivité. Que si condition est pour condition de base seulement. Sinon, cela deviendra une récursion infinie.
ajouté l'auteur Rohit Jain, source

7 Réponses

En récursion, il doit toujours y avoir un cas de base qui arrête la récursivité. Sans si , vous n'avez pas de scénario de base et rien ne l'arrête. Finalement, trop d'appels de méthode sont sur la pile et un résultat StackOverflowError .

7
ajouté
Pourquoi est-ce voté?
ajouté l'auteur Rohit Jain, source

Cette ligne entraîne la diminution de 1 de la variable number .

return number * factUsingRecursion(number - 1);

et il gérera toutes les valeurs de nombre sauf s'il est 1

donc cette ligne de code est une condition de rupture

if (number == 1) {
        return 1;

}

et il vous empêche d'éviter l'exception stackoverflow

2
ajouté

Imaginez ce qui se passe lorsque vous appelez:

factUsingRecursion(3);

Avec le si:

3*factUsingRecursion(2)
3*2*factUsingRecursion(1)
3*2*1

Sans le si:

3*factUsingRecursion(2)
3*2*factUsingRecursion(1)
3*2*1*factUsingRecursion(0)
3*2*1*0*factUsingRecursion(-1)
3*2*1*0*-1*factUsingRecursion(-2)
3*2*1*0*-1*-2*factUsingRecursion(-3)
...
And so on... It will not stop until you encounter the StackOverflow error
2
ajouté
@ user2341013 de rien. Au fait, sur StackOverflow, vous ne pouvez accepter (la coche verte) qu'une seule réponse, alors choisissez celle qui vous a le plus aidé. Vous pouvez upvoter (la flèche vers le haut) autant de réponses que vous le souhaitez.
ajouté l'auteur Paulpro, source
Merci beaucoup. C'est très clair maintenant. Appréciez votre réponse rapide!
ajouté l'auteur user2341013, source
Bien sûr, je l'ai. Je vous remercie. Dans ce cas cependant, toutes les réponses m'ont aidé;)
ajouté l'auteur user2341013, source

La récursivité nécessite un cas de base. Sans cela, il continuera d'appeler la fonction encore et encore et ne s'arrêtera jamais. L'instruction if est le cas de base, qui termine la récursivité. C'est pourquoi, si vous le supprimez, vous obtenez un StackOverflowError .

2
ajouté
Pourquoi cette réponse a-t-elle été votée?
ajouté l'auteur rgettman, source

Le programme ne fonctionnera plus lorsque vous supprimez la condition if car il ne vous restera plus que numéro de retour * factUsingRecursion (number - 1); et le factUsingRecursion (number - 1) ici aurait le même retour appelant numéro de retour * factUsingRecursion (number - 1); . Votre fonction s’appelle constamment, ne pouvant jamais évaluer rien. En définissant la condition, votre fonction est capable d'évaluer une valeur définitive à un moment donné de la chaîne récursive, et le premier appel peut être évalué.

1
ajouté

Il perd l'une des choses qui rendent une fonction récursive récursive en ce sens qu'elle n'a pas de condition de sortie.

Toutes les solutions récursives doivent respecter trois règles ou propriétés: Une solution récursive doit contenir un cas de base. Une solution récursive doit contenir un cas récursif. Une solution récursive doit progresser vers le scénario de base.

De: Structures de données et algorithmes utilisant Python

1
ajouté

Pour chaque entier i, vous appelez la fonction avec i -1. Integersa étant infini, vous ne cesserez jamais d'appeler la fonction. Par exemple, -1000 appellerait -1001 et continuera ainsi tant que JVM aura de la place dans sa pile.

0
ajouté