Calcola fattoriale in Java

1. Panoramica

Dato un intero non negativo n , fattoriale è il prodotto di tutti i numeri interi positivi minori o uguali a n .

In questo rapido tutorial, esploreremo diversi modi per calcolare il fattoriale per un dato numero in Java .

2. Fattoriale per numeri fino a 20

2.1. Fattoriale utilizzando un ciclo for

Vediamo un algoritmo fattoriale di base utilizzando un ciclo for :

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

La soluzione di cui sopra funzionerà bene per i numeri fino a 20 . Ma, se proviamo qualcosa di più grande di 20, fallirà perché i risultati sarebbero troppo grandi per essere inseriti in un lungo , causando un overflow.

Vediamone qualcun altro, notando che ognuno di questi funzionerà solo per piccoli numeri.

2.2. Fattoriale utilizzando Java 8 Streams

Possiamo anche utilizzare l' API Java 8 Stream per calcolare i fattoriali abbastanza facilmente:

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

In questo programma, usiamo prima LongStream per scorrere i numeri tra 1 e n . Abbiamo quindi utilizzato reduce () , che utilizza un valore di identità e una funzione di accumulatore per la fase di riduzione.

2.3. Fattoriale utilizzando la ricorsione

E vediamo un altro esempio di programma fattoriale, questa volta usando la ricorsione:

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

2.4. Fattoriale utilizzando Apache Commons Math

Apache Commons Math ha una classe CombinatoricsUtils con un metodo fattoriale statico che possiamo usare per calcolare il fattoriale.

Per includere Apache Commons Math, aggiungeremo la dipendenza commons-math3 nel nostro pom :

 org.apache.commons commons-math3 3.6.1 

Vediamo un esempio utilizzando la classe CombinatoricsUtils :

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

Notare che il tipo di restituzione è lungo , proprio come le nostre soluzioni coltivate in casa.

Ciò significa che se il valore calcolato supera Long.MAX_VALUE , viene generata un'eccezione MathArithmeticException .

Per ingrandirci, avremo bisogno di un diverso tipo di reso.

3. Fattoriale per numeri maggiori di 20

3.1. Fattoriale utilizzando BigInteger

Come discusso in precedenza, il tipo di dati lungo può essere utilizzato per i fattoriali solo per n <= 20 .

Per valori più grandi di n , possiamo usare la classe BigInteger dal pacchetto java.math , che può contenere valori fino a 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. Fattoriale utilizzando Guava

La libreria Guava di Google fornisce anche un metodo di utilità per il calcolo dei fattoriali per numeri più grandi.

Per includere la libreria, possiamo aggiungere la sua dipendenza guava al nostro pom :

 com.google.guava guava 25.1-jre 

Ora, possiamo usare il metodo fattoriale statico della classe BigIntegerMath per calcolare il fattoriale di un dato numero:

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

4. Conclusione

In questo articolo, abbiamo visto alcuni modi per calcolare i fattoriali utilizzando Java core e un paio di librerie esterne.

Abbiamo visto per la prima volta soluzioni utilizzando il tipo di dati lungo per calcolare fattoriali di numeri fino a 20 . Quindi, abbiamo visto un paio di modi per utilizzare BigInteger per numeri maggiori di 20.

Il codice presentato in questo articolo è disponibile su Github.