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.