Je ne l'ai pas encore trouvé. Ai-je oublié quelque chose? Je sais qu'une méthode factorielle est un programme d'exemple courant pour les débutants. Mais ne serait-il pas utile d'avoir une implémentation standard pour celle-ci à réutiliser? Je pourrais utiliser une telle méthode avec des types standard (par exemple int, long ...) et avec BigInteger / BigDecimal, aussi.
105
Apache Commons Math a quelques méthodes factorielles dans la classe MathUtils .
la source
Version Big Numbers par HoldOffHunger :
la source
Des factorielles nues nues sont rarement nécessaires dans la pratique. Le plus souvent, vous aurez besoin de l'un des éléments suivants:
1) diviser une factorielle par une autre, ou
2) réponse approximative en virgule flottante.
Dans les deux cas, vous seriez mieux avec des solutions personnalisées simples.
Dans le cas (1), disons, si x = 90! / 85 !, alors vous calculerez le résultat comme x = 86 * 87 * 88 * 89 * 90, sans avoir besoin de tenir 90! en mémoire :)
Dans le cas (2), google pour "l'approximation de Stirling".
la source
Utilisez les goyaves
BigIntegerMath
comme suit:(Une fonctionnalité similaire pour
int
etlong
est disponible dansIntMath
etLongMath
respectivement.)la source
Bien que les factorielles soient un bon exercice pour le programmeur débutant, elles ne sont pas très utiles dans la plupart des cas, et tout le monde sait comment écrire une fonction factorielle, donc elles ne sont généralement pas dans la bibliothèque moyenne.
la source
je crois que ce serait le moyen le plus rapide, par une table de consultation:
Pour le type natif
long
(8 octets), il ne peut contenir que20!
Évidemment,
21!
provoquera un débordement.Par conséquent, pour le type natif
long
, seul un maximum de20!
est autorisé, significatif et correct.la source
Étant donné que factorielle se développe si rapidement, le débordement de pile n'est pas un problème si vous utilisez la récursivité. En fait, la valeur de 20! est le plus grand que l'on puisse représenter dans un long Java. Ainsi, la méthode suivante calculera factorielle (n) ou lèvera une IllegalArgumentException si n est trop grand.
Une autre façon (plus cool) de faire la même chose est d'utiliser la bibliothèque de flux de Java 8 comme ceci:
En savoir plus sur les factorielles utilisant les flux de Java 8
la source
Le package Apache Commons Math a une méthode factorielle , je pense que vous pouvez l'utiliser.
la source
La réponse courte est: utilisez la récursivité.
Vous pouvez créer une méthode et appeler cette méthode directement dans la même méthode de manière récursive:
la source
System.out.println(calc(10));
pourSystem.out.println(calc(Long.MAX_VALUE));
vous devriez obtenir un stactrace assez long :)BigInteger
. J'ai essayé de calculer la factorielle du nombre8020
qui m'a donné le résultat613578884952214809325384...
qui a des27831
décimales. Donc, même lorsque vous travaillez avec des nombres, cet énorme nonStackoverflow
sera jeté. Bien sûr, vous avez raison, mais je doute qu'il y ait des chiffres aussi gros avec une utilisation pratique :-)Essaye ça
la source
i <= value
. La boucle for pourrait être légèrement optimisée pour(int i = 2; i <= value; i++)
.J'ai trouvé une astuce incroyable pour trouver des factorielles dans seulement la moitié des multiplications réelles.
Veuillez être patient car il s'agit d'un article un peu long.
Pour les nombres pairs : pour réduire de moitié la multiplication avec des nombres pairs, vous vous retrouverez avec n / 2 facteurs. Le premier facteur sera le nombre dont vous prenez la factorielle, puis le suivant sera ce nombre plus ce nombre moins deux. Le numéro suivant sera le numéro précédent plus le dernier numéro ajouté moins deux. Vous avez terminé lorsque le dernier numéro que vous avez ajouté était de deux (c'est-à-dire 2) . Cela n'a probablement pas beaucoup de sens, alors laissez-moi vous donner un exemple.
Notez que j'ai commencé par 8, puis le premier nombre que j'ai ajouté était 6, puis 4, puis 2, chaque nombre ajouté étant deux de moins que le nombre ajouté avant lui. Cette méthode équivaut à multiplier les moindres nombres avec les plus grands nombres, juste avec moins de multiplication, comme ceci:
Simple n'est-ce pas :)
Maintenant pour les nombres impairs: Si le nombre est impair, l'addition est la même, comme dans vous soustrayez deux à chaque fois, mais vous vous arrêtez à trois. Le nombre de facteurs change cependant. Si vous divisez le nombre par deux, vous vous retrouverez avec un nombre se terminant par 0,5. La raison en est que si nous multiplions les extrémités ensemble, il nous reste le nombre du milieu. Fondamentalement, tout cela peut être résolu en résolvant un nombre de facteurs égal au nombre divisé par deux, arrondi vers le haut. Cela n'a probablement pas beaucoup de sens non plus pour les esprits sans connaissances mathématiques, alors laissez-moi faire un exemple:
Remarque: Si vous n'aimez pas cette méthode, vous pouvez aussi simplement prendre la factorielle du nombre pair avant l'impair (huit dans ce cas) et la multiplier par le nombre impair (c'est-à-dire 9! = 8! * 9).
Maintenant, implémentons-le en Java:
isFirst
est une variable booléenne déclarée comme statique; il est utilisé pour le 1er cas où l'on ne souhaite pas modifier la somme précédente.Essayez avec des nombres pairs et impairs.
la source
Vous pouvez utiliser la récursivité.
puis après avoir créé la méthode (fonction) ci-dessus:
la source
La seule utilisation commerciale d'une factorielle à laquelle je puisse penser est les formules Erlang B et Erlang C, et tout le monde ne travaille pas dans un centre d'appels ou pour la compagnie de téléphone. L'utilité d'une fonctionnalité pour les entreprises semble souvent dicter ce qui apparaît dans une langue - regardez toutes les fonctions de traitement des données, XML et Web dans les principales langues.
Il est facile de conserver un extrait de code factoriel ou une fonction de bibliothèque pour quelque chose comme ça.
la source
Une méthode très simple pour calculer les factorielles:
J'ai utilisé double car ils peuvent contenir des nombres massifs, mais vous pouvez utiliser tout autre type comme int, long, float, etc.
PS Ce n'est peut-être pas la meilleure solution, mais je suis nouveau dans le codage et il m'a fallu du temps pour trouver un code simple capable de calculer les factorielles, j'ai donc dû écrire la méthode moi-même, mais je mets cela ici pour aider d'autres personnes comme moi .
la source
Vous pouvez également utiliser la version récursive.
La récursivité est généralement moins efficace en raison de la nécessité de pousser et de pop les récursions, donc l'itération est plus rapide. D'autre part, les versions récursives utilisent moins ou pas de variables locales, ce qui est un avantage.
la source
Factorielle est une fonction discrète très croissante, donc je pense que l'utilisation de BigInteger est préférable à l'utilisation de int. J'ai implémenté le code suivant pour le calcul de la factorielle d'entiers non négatifs.J'ai utilisé la récursivité au lieu d'utiliser une boucle.
Ici, la plage du grand entier est
Cependant, la plage de la méthode factorielle donnée ci-dessus peut être étendue jusqu'à deux fois en utilisant BigInteger non signé.
la source
Nous avons une seule ligne pour le calculer:
la source
Une méthode assez simple
la source
la source
la source
Nous devons mettre en œuvre de manière itérative. Si nous implémentons récursivement, cela provoquera StackOverflow si l'entrée devient très grande (c'est-à-dire 2 milliards). Et nous devons utiliser un nombre de taille non lié tel que BigInteger pour éviter un débordement arithmatique lorsqu'un nombre factoriel devient plus grand que le nombre maximum d'un type donné (c'est-à-dire 2 milliards pour int). Vous pouvez utiliser int pour un maximum de 14 de factorielles et long pour un maximum de 20 de factorielles avant le débordement.
Si vous ne pouvez pas utiliser BigInteger, ajoutez une vérification d'erreur.
la source
la source
boucle while (pour les petits nombres)
la source
Je l'ai obtenu d'EDX, utilisez-le! sa récursivité appelée
la source
avec récursivité:
avec boucle while:
la source
UTILISER LA PROGRAMMATION DYNAMIQUE EST EFFICACE
si vous voulez l'utiliser pour calculer encore et encore (comme la mise en cache)
Code Java:
la source
l'utilisation de la récursivité est la méthode la plus simple. si nous voulons trouver la factorielle de N, nous devons considérer les deux cas où N = 1 et N> 1 puisqu'en factorielle nous continuons à multiplier N, N-1, N-2 ,,,,, jusqu'à 1. si nous aller à N = 0 nous obtiendrons 0 pour la réponse. pour empêcher la factorielle d'atteindre zéro, la méthode récursive suivante est utilisée. À l'intérieur de la fonction factorielle, tandis que N> 1, la valeur de retour est multipliée par une autre initiation de la fonction factorielle. cela gardera le code appelant récursivement la factorielle () jusqu'à ce qu'il atteigne N = 1. pour le cas N = 1, il retourne N (= 1) lui-même et tout le résultat précédemment construit du retour multiplié N s est multiplié par N = 1. Ainsi donne le résultat factoriel.
la source