Calculați Factorial în Java

1. Prezentare generală

Având în vedere un număr întreg non-negativ n , factorial este produsul tuturor numerelor naturale mai mic sau egal cu n .

În acest tutorial rapid, vom explora diferite moduri de a calcula factorial pentru un anumit număr în Java .

2. Factorial pentru numere de până la 20

2.1. Factorial folosind un pentru buclă

Să vedem un algoritm factorial de bază folosind o buclă for :

public long factorialUsingForLoop(int n) { long fact = 1; for (int i = 2; i <= n; i++) { fact = fact * i; } return fact; }

Soluția de mai sus va funcționa bine pentru numere de până la 20 . Dar, dacă încercăm ceva mai mare de 20, atunci acesta va eșua, deoarece rezultatele ar fi prea mari pentru a se potrivi într-o lungă perioadă de timp , provocând o revărsare.

Să vedem încă câteva, menționând că fiecare dintre acestea va funcționa doar pentru un număr mic.

2.2. Factorial Utilizarea fluxurilor Java 8

De asemenea, putem utiliza API-ul Java 8 Stream pentru a calcula factorialele destul de ușor:

public long factorialUsingStreams(int n) { return LongStream.rangeClosed(1, n) .reduce(1, (long x, long y) -> x * y); }

În acest program, folosim mai întâi LongStream pentru a itera prin numerele cuprinse între 1 și n . Apoi am folosit reduce () , care folosește o valoare de identitate și o funcție de acumulator pentru pasul de reducere.

2.3. Factorial folosind recursivitate

Și să vedem un alt exemplu de program factorial, de data aceasta folosind recursivitatea:

public long factorialUsingRecursion(int n) { if (n <= 2) { return n; } return n * factorialUsingRecursion(n - 1); }

2.4. Factorial folosind Apache Commons Math

Apache Commons Math are o clasă CombinatoricsUtils cu o metodă factorială statică pe care o putem folosi pentru a calcula factorialul.

Pentru a include Apache Commons Math, vom adăuga dependența commons-math3 în pomul nostru :

 org.apache.commons commons-math3 3.6.1 

Să vedem un exemplu folosind clasa CombinatoricsUtils :

public long factorialUsingApacheCommons(int n) { return CombinatoricsUtils.factorial(n); }

Observați că tipul său de returnare este lung , la fel ca soluțiile noastre cultivate acasă.

Asta înseamnă că, dacă valoarea calculată depășește Long.MAX_VALUE , se aruncă o excepție MathArithmeticException .

Pentru a deveni mai mari, vom avea nevoie de un alt tip de returnare.

3. Factorial pentru numere mai mari de 20

3.1. Factorial folosind BigInteger

Așa cum s-a discutat anterior, tipul de date lung poate fi utilizat pentru factoriale numai pentru n <= 20 .

Pentru valori mai mari de n , putem folosi clasa BigInteger din pachetul java.math , care poate conține valori de până la 2 ^ Integer.MAX_VALUE :

public BigInteger factorialHavingLargeResult(int n) { BigInteger result = BigInteger.ONE; for (int i = 2; i <= n; i++) result = result.multiply(BigInteger.valueOf(i)); return result; }

3.2. Factorial folosind guava

Biblioteca Google Guava oferă, de asemenea, o metodă de utilitate pentru calcularea factorialelor pentru un număr mai mare.

Pentru a include biblioteca, putem adăuga sale guava dependența noastră de POM :

 com.google.guava guava 25.1-jre 

Acum, putem folosi metoda factorială statică din clasa BigIntegerMath pentru a calcula factorialul unui număr dat:

public BigInteger factorialUsingGuava(int n) { return BigIntegerMath.factorial(n); }

4. Concluzie

În acest articol, am văzut câteva moduri de a calcula factorialele folosind Java de bază, precum și câteva biblioteci externe.

Am văzut mai întâi soluții folosind tipul lung de date pentru calcularea factorialelor de numere până la 20 . Apoi, am văzut câteva modalități de a folosi BigInteger pentru numere mai mari de 20.

Codul prezentat în acest articol este disponibil pe Github.