给定一个非负整数n,阶乘是所有小于或等于n的正整数的乘积。
在这个快速教程中,我们将探索在 Java 中为给定数字计算阶乘的不同方法。
(1)使用for循环的阶乘
让我们看一个使用Java 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)使用 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(),它使用标识值和累加器函数进行归约步骤。
(3)使用递归的阶乘
让我们看另一个阶乘程序的例子,这次使用递归:
public long factorialUsingRecursion(int n) {
if (n <= 2) {
return n;
}
return n * factorialUsingRecursion(n - 1);
}
(4)使用 Apache Commons Math 的阶乘
Apache Commons Math有一个带有静态阶乘方法的CombinatoricsUtils类,我们可以使用它来计算阶乘。
要包含 Apache Commons Math,我们将在 pom中 添加commons-math3依赖项:
<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。
为了变得更大,我们将需要不同的返回类型。
(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;
}
(2)使用Guava的阶乘
Google 的Guava库还提供了一种用于计算较大数字的阶乘的实用方法。
要包含该库,我们可以将其guava依赖 项添加到我们的 pom中:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>
现在,我们可以使用BigIntegerMath类中的静态阶乘方法 来计算给定数字的阶乘:
public BigInteger factorialUsingGuava(int n) {
return BigIntegerMath.factorial(n);
}
以上就是关于“Java求阶乘的计算方法”的介绍,大家如果想了解更多相关知识,可以关注一下动力节点的Java在线学习,里面的课程内容细致全面,很适合小白学习,希望对大家能够有所帮助。
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习