Javaで階乗を計算する

Javaで階乗を計算する

1. 概要

非負の整数nが与えられた場合、階乗はn以下のすべての正の整数の積です。

このクイックチュートリアルでは、different ways to calculate factorial for a given number in 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;
}

上記のソリューションはfine for numbers up to 20で機能します。 ただし、20より大きいものを試してみると、results would be too large to be fit into a longが原因で失敗し、オーバーフローが発生します。

these will only work for small numbers.のそれぞれに注意して、さらにいくつか見てみましょう

2.2. Java 8ストリームを使用した階乗

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()を使用しました。これは、削減ステップにID値とアキュムレータ関数を使用します。

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を含めるために、the commons-math3 dependencypomに追加します。


    org.apache.commons
    commons-math3
    3.6.1

CombinatoricsUtils classを使用した例を見てみましょう。

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

自社開発のソリューションと同様に、戻り値の型がlongであることに注意してください。

つまり、計算値がLong.MAX_VALUEを超えると、MathArithmeticExceptionがスローされます。

大きくするには、we are going to need a different return type.

3. 20を超える数の階乗

3.1. BigIntegerを使用した階乗

前に説明したように、longデータ型は、n ⇐ 20の階乗にのみ使用できます。

nの値が大きい場合、values up to 2^Integer.MAX_VALUEを保持できるjava.mathパッケージのwe can use the BigInteger class

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. グアバを使用した階乗

GoogleのGuavaライブラリは、より大きな数の階乗を計算するためのユーティリティメソッドも提供します。

ライブラリを含めるには、そのthe guava dependencypomに追加します。


    com.google.guava
    guava
    25.1-jre

これで、BigIntegerMathクラスの静的factorialメソッドを使用して、指定された数値の階乗を計算できます。

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

4. 結論

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

最初に、20までの数値の階乗を計算するためにlongデータ型を使用するソリューションを見ました。 次に、20より大きい数値にBigInteger を使用するいくつかの方法を見ました。

この記事に記載されているコードは、over on Githubで入手できます。