Factorial in Java berechnen

Factorial in Java berechnen

1. Überblick

Bei einer nicht negativen ganzen Zahln ist die Fakultät das Produkt aller positiven ganzen Zahlen kleiner oder gleichn.

In diesem kurzen Tutorial werden wirdifferent ways to calculate factorial for a given number in Java untersuchen.

2. Fakultät für Zahlen bis 20

2.1. Faktoriell unter Verwendung einerfor-Schleife

Sehen wir uns einen grundlegenden faktoriellen Algorithmus an, der einefor-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 funktioniertfine for numbers up to 20. Wenn wir jedoch etwas Größeres als 20 versuchen, schlägt dies fehl, weilresults would be too large to be fit into a long einen Überlauf verursacht.

Sehen wir uns noch ein paar an und stellen fest, dass jedesthese will only work for small numbers.

2.2. Factorial mit Java 8-Streams

Wir können auch dieJava 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 zuerstLongStream, um die Zahlen zwischen 1 undn zu durchlaufen. Wir haben dannreduce() verwendet, das einen Identitätswert und eine Akkumulatorfunktion für den Reduktionsschritt verwendet.

2.3. Fakultativ mit Rekursion

Schauen 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 mit Apache Commons Math

Apache Commons Math hat eineCombinatoricsUtils-Klasse mit einer statischenfactorial-Methode, mit der wir die Fakultät berechnen können.

Um Apache Commons Math einzuschließen, fügen wirthe commons-math3 dependency zu unserenpom hinzu:


    org.apache.commons
    commons-math3
    3.6.1

Sehen wir uns ein Beispiel mit derCombinatoricsUtils -Skala an:

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

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

Dies bedeutet hier, dass, wenn der berechnete WertLong.MAX_VALUE überschreitet, einMathArithmeticException ausgelöst wird.

Um größer zu werden,we are going to need a different return type.

3. Fakultät für Zahlen größer als 20

3.1. Faktoriell mitBigInteger

Wie bereits erwähnt, kann der Datentyplong nur fürn ⇐ 20 für Fakultäten verwendet werden.

Für größere Werte vonn giltwe can use the BigInteger class aus dem Paketjava.math, dasvalues up to 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. Factorial mit Guave

DieGuava-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 ihrethe guava dependency zu unserenpom hinzufügen:


    com.google.guava
    guava
    25.1-jre

Jetzt können wir die statischefactorial-Methode aus derBigIntegerMath-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 unter Verwendung von Kern-Java sowie einige externe Bibliotheken vorgestellt.

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

Der in diesem Artikel vorgestellte Code istover on Github verfügbar.