Javaで階乗を計算する
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]から入手できます。