2009-10-04 4 views
0

L'apprentissage de récursivité et ayant des problèmes avec le code affiché ci-dessous, dans la ligne 6,Learning Java récursion de livre, Java, une référence complète

int result=fact(n-1)*n; 

Lorsque je supprime « fait » le programme agit comme je pense qu'il serait, l'impression:

 
Factor of 3 6 
Factor of 4 12 
Factor of 5 20 

mais avec le "fait" dans ce qui donne la sortie ci-dessous? Que fait cette ligne, et qu'est ce que le "fait"? Merci tout le monde.

 
Factor of 3 6 
Factor of 4 24 
Factor of 5 120 
+1

pourquoi vous attendez factoriel de 4 à être 12 ?? vous pouvez voir factorielle de 3 est 6. si * n * est 4, alors 'fait (n-1) * n' est' fait (3) * 4' est '6 * 4' est 24. – Kip

+4

Les manuels doivent arrêtez d'utiliser un exemple si artificiel pour enseigner la récursivité. Une fois qu'un étudiant voit la solution itérative, ils s'en vont en pensant que la récursivité est inutile.

Répondre

0

fact(5) = fact(4) * 5 
fact(4) = fact(3) * 4 
fact(3) = fact(2) * 3 
fact(2) = fact(1) * 2 
fact(1) = 1 

fact(5) = fact(4) * 5 = fact(3) * 4 * 5 = .. = 1 * 2 * 3 * 4 * 5 = 120 

fonction elle-même appelle recuresively il déballe calcul à 1 * 2 * 3 * 4 * 5.

3

Factorial est souvent utilisé comme un exemple de quelque chose qui peut être réalisée en utilisant récursion .

Par exemple, factoriel 5 est calculé comme suit:

5! = 5 * 4 * 3 * 2 * 1 

De plus, il y a une autre façon de penser:

5! = 5 * 4! 
4! = 4 * 3! 
3! = 3 * 2! 
2! = 2 * 1! 
1! = 1 

La façon dont la deuxième série d'égalités sont écrits, on peut voir qu'une factorielle peut être calculée de manière récursive. Par exemple:

5! = 5 * 4! --> 5! = 5 * (4 * 3!) --> 5! = 5 * (4 * (3 * 2!)) --> and so on. 

La fonction fact dans la question exécute la fonction factoriel comme écrit dans la deuxième série d'égalités:

fact(n) = n * fact(n-1); 

Ainsi, lorsque la méthode fact est appelée, elle est ainsi être appelé peut être considéré comme quelque chose comme ce qui suit:

fact(5) --> fact(5 * fact(4)) --> fact(5 * fact(4 * fact(3))) --> and so on. 

en outre, il convient de noter que Kip souligne la co Le calcul de la factorielle d'un nombre peut être facilement et rapidement calculé en itérant sur la plage de nombres de n à 1 et en le multipliant ensemble pour calculer le résultat.

+0

et aussi, il est à noter, de quelque chose qui * ne devrait pas * être effectué avec récursion, car une boucle itérative est si facile. – Kip

+0

Ou une recherche de table est tellement plus efficace. Personne dans leur bon sens n'utiliserait l'itération ou la récursion pour calculer un factoriel. La chose la plus efficace est soit une recherche de table ou la fonction gamma. – duffymo

+0

@duffymo: spécialement pour les entiers, même les entiers de 64 bits débordent à 20! ou quelque chose comme ça. une fonction factorielle renvoyant un double doublerait probablement assez vite la gamme des doubles (la fonction factorielle grandit très vite ...) – Kip

1

Apparemment, c'est le classique exemple de récursivité en utilisant le calcul factoriel .

Ce que vous appelez fact(N) est généralement noté N! (par des mathématiciens, de toute façon)

n! = n x (n-1) x (n-2) ...

si 5! = 5 x 4 x 2 x 1 = 120
4! = 4 x 3 x 2 x 1 = 24

Soit dit en passant, cela peut être un peu contre-intuitif, mais 0!est défini comme 1

0

Lorsque vous supprimez l'appel à fait nouveau que vous faites juste:

println(n * (n-1)) 

Vous pouvez essayer de faire un factoriel avec juste une boucle et voir à quel point le code est. La récursion peut être utile, mais, vous serez limité dans la taille de (n) que vous pouvez appeler, car vous finirez par déborder la pile, puisque les calculs ne se feront pas jusqu'à ce que vous atteigniez la condition qui marque la fin de la récursivité.

Pour mieux comprendre récursivité vous pouvez regarder ce lien: http://en.wikipedia.org/wiki/Recursion_(computer_science)

Questions connexes