用 Java 计算阶乘的 3 种方法
原文: https://howtodoinjava.com/puzzles/3-ways-to-calculate-factorial-in-java/
编写程序以用 Java 计算阶乘 – 可能是 Java 面试期间的编码练习。 最好了解如何构建这样的析因程序。 让我们经历以下三种方式:
1)使用迭代计算阶乘
简单而最基本的版本。 很高兴知道,但由于性能原因没有使用权。
public static long factorialIterative ( long n )
{
long r = 1;
for ( long i = 1; i <= n; i++ )
{
r*=i;
}
return r;
}
2)使用递归计算阶乘
如果您使用的是 Java7 或更低版本,那么这是您的最佳选择。 一个很好接受的答案。 它使用递归来计算阶乘。
public static long factorialRecursive( long n )
{
return n == 1 ? 1 : n * factorialRecursive( n-1 );
}
3)使用流计算阶乘(Java8)
Java8 支持流,您可以使用流以最有效的方式计算阶乘,如下所示。
public static long factorialStreams( long n )
{
return LongStream.rangeClosed( 1, n )
.reduce(1, ( long a, long b ) -> a * b);
}
- 在这里,
LongStream.rangeClosed(2, n)
方法创建内容为[2, 3, ... , n]
的long
流。 reduce (a, b) -> a * b
表示每对a
和b
– 将它们相乘并返回结果。 然后结果继续到下一轮。- 在简化方法中使用的值“1”在第一次迭代中用作变量
a
的起始值。
4)使用BigInteger
计算大于 20 的数字的阶乘
如果您为大于 20 的数字运行以上示例中的任何一个; 由于long
数据类型的限制,您将获得错误的输出。
System.out.println(getFactorial(20)); // 2432902008176640000
System.out.println(getFactorial(21)); // -4249290049419214848
值变得比long
所能容纳的更大。 BigInteger
类分配所需的内存,以容纳需要保存的所有数据位。 显然,如果系统中预设了那么多的内存,则只能这样。
现在,您将需要BigInteger
来保存更大的值,并使用以下代码获取阶乘。
public static BigInteger getFactorial(int num) {
BigInteger result = BigInteger.ONE;
for (int i = 1; i <= num; i++)
result = result.multiply(BigInteger.valueOf(i));
return result;
}
现在,无论数量多大,您都可以得到阶乘。
System.out.println(getFactorial(22)); // 1124000727777607680000
System.out.println(getFactorial(32)); // 263130836933693530167218012160000000
System.out.println(getFactorial(132)); // Indeed a very long number is printed - Try yourself.
学习愉快!