Factorielle en utilisant la Récursivité en Java
Je suis à l'apprentissage de Java à l'aide du livre de Java: La Référence Complète.
Actuellement, je suis en train de travailler sur le thème de la Récursivité.
Veuillez Noter: Il y a des questions similaires sur stackoverflow. J'ai cherché mais je n'ai pas trouvé la solution à ma question. Je suis confondue avec la logique dans le programme suivant.
Si je lance le programme ci-dessous, il produit de bons résultats, mais je ne comprends pas la logique.
- Je ne comprenais pas la logique dans la ligne suivante : résultat = fact(n-1) * n;
- De mes connaissances, Si l'on fait passer la valeur de n=4, comme indiqué dans le programme ci-dessous,
- Puis, 3 * 4 est stocké dans le résultat c'est a dire 12.
- De nouveau, fact(n-1) est appelée. Alors n devient 3.
- Puis le 2 * 3 est stocké dans le résultat du remplacement de la précédente 12.
-
Je pense que vous avez compris où je suis bloqué jusqu'à confusion.
-
Merci.
class Calculation { int fact(int n) { int result; if(n==1) return 1; result = fact(n-1) * n; return result; } } public class Factorial { public static void main(String args[]) { Calculation obj_one = new Calculation(); int a = obj_one.fact(4); System.out.println("The factorial of the number is : " + a); } }
- Mon conseil est avant de creuser profondément dans Java, vous devez d'abord comprendre les maths derrière la récursivité. Si vous ne l'avez pas fait, ce sera un très bon début pour vous en.wikipedia.org/wiki/Recursion
- Espérons que cela vous rend beaucoup plus clair programmerinterview.com/index.php/recursion/...
Vous devez vous connecter pour publier un commentaire.
result
est une variable locale de lafact
méthode. Donc, chaque fois que le fait la méthode est appelée, le résultat est stocké dans une variable différente que la précédente fait l'invocation.Alors quand fait est invoqué avec 3 comme argument, vous pouvez imaginer que son résultat est
D'abord, vous devez comprendre comment les travaux factoriels.
Permet de prendre 4! à titre d'exemple.
Permettez-nous de simuler le code à l'aide de l'exemple ci-dessus:
Dans la plupart des langages de programmation, nous avons ce que nous appelons
function stack
. Il est juste comme un jeu de cartes, où chaque carte est placée au-dessus de l'autre, et chaque carte peut être considéré comme une fonction, Donc, en passant sur la méthodefact
:Niveau de la pile 1:
fact(4) //n = 4 and is not equal to 1. So we call fact(n-1)*n
Niveau de la pile 2:
fact(3)
Niveau de la pile 3:
fact(2)
Niveau de la pile 4:
fact(1)
//maintenant, n = 1. si nous revenons 1 à partir de cette fonction.renvoi de valeurs...
Niveau de la pile 3:
2 * fact(1) = 2 * 1 = 2
Niveau de la pile 2:
3 * fact(2) = 3 * 2 = 6
Niveau de la pile 1:
4 * fact(3) = 4 * 6 = 24
donc nous avons 24.
Prendre note de ces lignes:
ou tout simplement:
Ce appels de la fonction elle-même. À l'aide de 4 par exemple,
En séquence selon la fonction de piles..
La substitution des résultats...
J'espère que vous obtenez le point.
Ici est encore une autre explication de la façon dont le factorielle calcul en utilisant la récursivité œuvres.
Nous allons modifier le code source légèrement:
Ici est le calcul de 3! en détails:
Source: La RÉCURSIVITÉ (Java, C++) | Algorithmes et Structures de Données
Votre confusion, je crois, vient du fait que vous pensez qu'il n'est qu'un
result
variable, alors qu'en fait il y a unresult
variable pour chaque appel de fonction. À cet effet, les anciens résultats ne sont pas remplacés, mais est retournée.D'ÉLABORER:
Assumer un appel à
fact(2)
:Espère que c'est plus clair maintenant.
Ce qui se passe, c'est que l'appel récursif lui-même les résultats dans récursive comportement. Si vous avez été à l'écrire, vous bénéficiez de:
Le point clé que vous manque ici, c'est que la variable "result" est une pile variable, et en tant que tel, il n'a pas "remplacé". D'élaborer, de tous les temps fait est appelé, une NOUVELLE variable appelée "résultat" est créé en interne par l'interprète et liée à l'invocation de méthodes. Ceci est en contraste des champs d'objet qui était liée à l'instance de l'objet et non pas un appel de méthode spécifique
Même si c'est vieux, il tient encore à venir assez bien dans google. Alors j'ai pensé que je voudrais mentionner. Personne n'a indiqué à vérifier quand vous x = 0.
0! et 1! les deux = 1.
Ce n'est pas vérifiée avec les réponses précédentes, et serait la cause d'un débordement de la pile, si fact(0) a été exécuté. De toute façon simple correctif:
Une solution récursive en utilisant des opérateurs ternaires.
À mon avis, et que l'avis de quelqu'un avec un niveau débutant connaissance de java, je voudrais suggérer que le n == 1 être modifié en n <= 1 ou n == 0)||(n==1) parce que la factorielle de 0 est 1.
Correcte est :
Ce serait de retour 1 pour la factorielle de 0. Faire crois moi . J'ai appris cela à la dure.
Juste pour ne pas observer la condition de 0 ne pouvait pas effacer une interview.
De comprendre ce que vous avez à déclarer la méthode de la façon la plus simple possible et martynas cloué sur 6 Mai post:
lu la mise en œuvre et vous comprendrez.
À mon humble avis, la clé de la compréhension de la récursivité des actions liées est:
en quelque sorte modifier une valeur (par exemple, n-1 dans
func(n-1);
) qui détermine si lela récursivité doit aller plus loin et plus profond.
recursionStopCondition est remplie (par exemple,
n == 0
), les récurrences s'arrête,et les méthodes de travail réel et les valeurs de retour à l'appelant de la méthode dans
supérieure des piles, ainsi bouillonnant en haut de la pile.
important pour attraper la valeur retournée plus en profondeur de la pile, en quelque sorte
modifier (la multiplication par n dans votre cas), et ensuite de retour à ce
valeur modifiée topwards la pile. L'erreur commune est que l'
la valeur de la plus profonde trame de pile est renvoyé tout droit vers le haut
de la pile, de sorte que tous les appels de méthode sont ignorés.
Sûrement, les méthodes peuvent faire œuvre utile avant de plonger dans la récursion (du haut vers le bas de la pile), ou sur le chemin du retour.
À l'aide de Java 8 et ci-dessus, en utilisant la récursivité lui-même
Et de l'utiliser comme
ne pas créer une autre variable
simplement
Bien ici, c'est la logique pour trouver la factorielle d'un nombre en utilisant la récursivité,
En attendant, vous pouvez consulter cette de ressources pour trouver des exemples sur la factorielle d'un nombre en utilisant la récursivité.