用 Java 计算阶乘的 3 种方法

用 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表示每对ab – 将它们相乘并返回结果。 然后结果继续到下一轮。
  • 在简化方法中使用的值“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.

学习愉快!