StackOverflowError factoriel informatique d'un BigInteger?
Je suis en train d'écrire un programme Java pour calculer la factorielle d'un grand nombre. Il semble BigInteger
n'est pas en mesure de tenir de tels un grand nombre.
Le ci-dessous le (simple) code que j'ai écrit.
public static BigInteger getFactorial(BigInteger num) {
if (num.intValue() == 0) return BigInteger.valueOf(1);
if (num.intValue() == 1) return BigInteger.valueOf(1);
return num.multiply(getFactorial(num.subtract(BigInteger.valueOf(1))));
}
Le nombre maximal le programme ci-dessus les poignées en 5022, après que le programme génère un StackOverflowError
. Existe-il d'autres façons de le gérer?
source d'informationauteur Vinoth Kumar C M
Vous devez vous connecter pour publier un commentaire.
Le problème ici semble comme sa un débordement de pile de trop la récursivité (5000 appels récursifs ressemble le bon nombre d'appels de souffler un Java la pile des appels) et non comme une limitation de
BigInteger
. La réécriture de la fonction factorielle de manière itérative devrait résoudre ce problème. Par exemple:Espérons que cette aide!
Le problème n'est pas BigInteger, il est de votre utilisation d'une méthode récursive appel (
getFactorial()
).Essayez ceci au lieu de cela, un algorithme itératif:
La Goyave des bibliothèques de Google est très optimisé mise en œuvre de factorielle des sorties BigIntegers. Check it out. (Il n'est plus équilibrée, se multiplie et optimise loin de simples décalages).
Naïf implémentations de factorielle ne travaillent pas dans des situations réelles.
Si vous avez un besoin sérieux, la meilleure chose à faire est d'écrire un gamma fonction (ou
ln(gamma)
fonction) qui fonctionne non seulement pour les entiers, mais est également correcte pour les nombres décimaux. Memoize résultats de sorte que vous n'avez pas à répéter les calculs à l'aide d'unWeakHashMap
et vous êtes en affaires.