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 dependencyをpomに追加します。
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 dependencyをpomに追加します。
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で入手できます。