# 用 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）使用递归计算阶乘

如果您使用的是 Java 7 或更低版​​本，那么这是您的最佳选择。 一个很好接受的答案。 它使用递归来计算阶乘。

```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`](https://docs.oracle.com/javase/8/docs/api/java/util/stream/LongStream.html).rangeClosed(2, n)方法创建内容为`[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.
```

学习愉快！