1.概要

負でない整数

n

が与えられた場合、階乗は

n

以下のすべての正の整数の積です。

このクイックチュートリアルでは、Javaで特定の数の階乗を計算する** さまざまな方法を探ります。

2.最大20までの階乗

2.1.

for

ループを使う


for

ループを使った基本的な階乗アルゴリズムを見てみましょう。

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

上記の解決策は20までの数に対して

うまくいくでしょう

。しかし、20より大きい値を試した場合、

結果が

long


に収まるには大きすぎてオーバーフローが発生するため、失敗します。

もう少し見てみましょう。** これらはそれぞれ少数でしか動作しません。

2.2. Java 8ストリームの使用

階乗を簡単に計算するためにhttps://www.baeldung.com/java-8-streams-introduction[Java 8

Stream

API]を使用することもできます。

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

このプログラムでは、最初に

LongStream

を使用して1と

n

の間の数字を繰り返します。それから

reduce()

を使いました。それは還元ステップのために識別値とアキュムレータ関数を使います。

2.3. 再帰を使う

そして、今回は再帰を使用した階乗計画の別の例を見てみましょう。

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

2.4. Apache Commons Mathを使う


Apache Commons Math

には、階乗の計算に使用できる静的な

factorial

メソッドを持つ

CombinatoricsUtils

クラスがあります。

Apache Commons Mathを含めるには、https://search.maven.org/search?q=a:commons-math3[thecommons-math3

依存関係]を

pom__に追加します。

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-math3</artifactId>
    <version>3.6.1</version>
</dependency>


__CombinatoricsUtils

__クラスを使用した例を見てみましょう。

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

自社製ソリューションと同じように、その戻り型は

long

です。

つまり、計算値が

Long.MAX

VALUE

を超えると、

MathArithmeticException__がスローされます。

さらに大きくするには、** 別の戻り型が必要になります。

3. 20より大きい数の階乗

3.1.

BigInteger

を使う

前述したように、

long

データ型は

n ⇐ 20

の場合にのみ階乗に使用できます。


n

の値が大きい場合は、

java.math

パッケージの

BigInteger

クラスを使用できます。


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. グアバの使用

グーグルのhttps://www.baeldung.com/category/guava/[Guava]ライブラリには、より大きな数の階乗を計算するための実用的な方法もあります。

ライブラリを含めるには、そのhttps://search.maven.org/search?q=guava[the

__guava


dependency]を

pom__に追加します。

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>25.1-jre</version>
</dependency>

これで、

BigIntegerMath

クラスの静的

factorial

メソッドを使って、与えられた数の階乗を計算できます。

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

4.まとめ

この記事では、コアJavaといくつかの外部ライブラリーを使用して階乗を計算する方法をいくつか紹介しました。

最初に、

20

までの数値の階乗を計算するために

long

データ型を使用したソリューションを見ました。次に、20を超える数に

__BigInteger

__を使用する方法をいくつか見ました。

この記事で紹介されているコードはhttps://github.com/eugenp/tutorials/tree/master/algorithms-miscellaneous-1[over on Github]から入手できます。