Berechnen Sie Factorial in Java

1. Übersicht

Bei einer nicht negativen ganzen Zahl n ist die Fakultät das Produkt aller positiven ganzen Zahlen kleiner oder gleich n .

In diesem kurzen Tutorial werden verschiedene Methoden zur Berechnung der Fakultät für eine bestimmte Zahl in Java untersucht .

2. Faktor für Zahlen bis 20

2.1. Faktorielle Verwendung einer for- Schleife

Sehen wir uns einen grundlegenden faktoriellen Algorithmus an, der eine for- Schleife verwendet:

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

Die obige Lösung funktioniert gut für Zahlen bis zu 20 . Wenn wir jedoch etwas versuchen, das größer als 20 ist, schlägt dies fehl, da die Ergebnisse zu groß wären, um in eine lange Zeit zu passen , was zu einem Überlauf führen würde.

Lassen Sie uns noch ein paar mehr sehen und feststellen, dass jede dieser Funktionen nur für kleine Zahlen geeignet ist.

2.2. Factorial Verwenden von Java 8-Streams

Wir können auch die Java 8 Stream- API verwenden, um Fakultäten ganz einfach zu berechnen:

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

In diesem Programm verwenden wir zuerst LongStream , um die Zahlen zwischen 1 und n zu durchlaufen . Wir haben dann redu () verwendet , das einen Identitätswert und eine Akkumulatorfunktion für den Reduktionsschritt verwendet.

2.3. Faktoriell mit Rekursion

Und sehen wir uns ein weiteres Beispiel für ein Fakultätsprogramm an, diesmal mit Rekursion:

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

2.4. Factorial Verwenden von Apache Commons Math

Apache Commons Math verfügt über eine CombinatoricsUtils- Klasse mit einer statischen Fakultätsmethode , mit der wir die Fakultät berechnen können.

Um Apache Commons Math einzuschließen , fügen wir die pons-math3- Abhängigkeit in unser pom ein :

 org.apache.commons commons-math3 3.6.1 

Sehen wir uns ein Beispiel mit der CombinatoricsUtils- Klasse an:

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

Beachten Sie, dass der Rückgabetyp lang ist , genau wie bei unseren selbst entwickelten Lösungen.

Dies bedeutet hier, dass eine MathArithmeticException ausgelöst wird , wenn der berechnete Wert Long.MAX_VALUE überschreitet .

Um größer zu werden, benötigen wir einen anderen Rückgabetyp.

3. Faktor für Zahlen größer als 20

3.1. Faktoriell mit BigInteger

Wie bereits erwähnt, kann der lange Datentyp nur für Fakultäten für n <= 20 verwendet werden .

Für größere Werte von n können wir die BigInteger- Klasse aus dem Paket java.math verwenden , die Werte bis zu 2 ^ Integer.MAX_VALUE enthalten kann :

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. Faktoriell mit Guave

Die Guava-Bibliothek von Google bietet auch eine Dienstprogrammmethode zur Berechnung von Fakultäten für größere Zahlen.

Um die Bibliothek einzuschließen, können wir die Guavenabhängigkeit zu unserem POM hinzufügen :

 com.google.guava guava 25.1-jre 

Jetzt können wir die statische Fakultätsmethode aus der BigIntegerMath- Klasse verwenden, um die Fakultät einer bestimmten Zahl zu berechnen:

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

4. Fazit

In diesem Artikel haben wir einige Möglichkeiten zur Berechnung von Fakultäten mit Java-Kern sowie einige externe Bibliotheken gesehen.

Wir haben zuerst Lösungen gesehen, die den langen Datentyp zur Berechnung von Fakultäten mit Zahlen bis zu 20 verwenden . Dann haben wir einige Möglichkeiten gesehen, BigInteger für Zahlen größer als 20 zu verwenden.

Der in diesem Artikel vorgestellte Code ist auf Github verfügbar.