ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
# 用 Java 计算阶乘的 3 种方法 > 原文: [https://howtodoinjava.com/puzzles/3-ways-to-calculate-factorial-in-java/](https://howtodoinjava.com/puzzles/3-ways-to-calculate-factorial-in-java/) 编写程序以用 Java 计算[阶乘](https://en.wikipedia.org/wiki/Factorial) – 可能是 [Java 面试](//howtodoinjava.com/java-interview-questions/)期间的编码练习。 最好了解如何构建这样的析因程序。 让我们经历以下三种方式: ## 1)使用迭代计算阶乘 简单而最基本的版本。 很高兴知道,但由于性能原因没有使用权。 ```java public static long factorialIterative ( long n ) { long r = 1; for ( long i = 1; i <= n; i++ ) { r*=i; } return r; } ``` ## 2)使用递归计算阶乘 如果您使用的是 Java7 或更低版​​本,那么这是您的最佳选择。 一个很好接受的答案。 它使用递归来计算阶乘。 ```java public static long factorialRecursive( long n ) { return n == 1 ? 1 : n * factorialRecursive( n-1 ); } ``` ## 3)使用流计算阶乘(Java8) Java8 支持流,您可以使用流以最有效的方式计算阶乘,如下所示。 ```java public static long factorialStreams( long n ) { return LongStream.rangeClosed( 1, n ) .reduce(1, ( long a, long b ) -> a * b); } ``` * 在这里,[`LongStream.rangeClosed(2, n)`](https://docs.oracle.com/javase/8/docs/api/java/util/stream/LongStream.html)方法创建内容为`[2, 3, ... , n]`的`long`流。 * `reduce (a, b) -> a * b`表示每对`a`和`b` – 将它们相乘并返回结果。 然后结果继续到下一轮。 * 在简化方法中使用的值“1”在第一次迭代中用作变量`a`的起始值。 ## 4)使用`BigInteger`计算大于 20 的数字的阶乘 如果您为大于 20 的数字运行以上示例中的任何一个; 由于`long`数据类型的限制,您将获得错误的输出。 ```java System.out.println(getFactorial(20)); // 2432902008176640000 System.out.println(getFactorial(21)); // -4249290049419214848 ``` 值变得比`long`所能容纳的更大。 **`BigInteger`类分配所需的内存,以容纳需要保存的所有数据位。** 显然,如果系统中预设了那么多的内存,则只能这样。 现在,您将需要[`BigInteger`](https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html)来保存更大的值,并使用以下代码获取阶乘。 ```java 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; } ``` 现在,无论数量多大,您都可以得到阶乘。 ```java 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. ``` 学习愉快!