Java阶乘可用递归和循环实现,推荐循环以避免栈溢出;基础循环版用int仅支持n≤12,大数需BigInteger。

Java 中求阶乘可以用递归和循环两种方式实现,核心都是将 n! 定义为 n × (n−1) × ... × 1(其中 0! = 1)。下面分别给出清晰、可直接运行的实现,并说明关键点。
用循环实现阶乘(推荐用于大一点的 n)
循环方式更节省内存,不会因深度调用引发栈溢出,适合计算稍大的数(如 n ≤ 10000,但注意结果可能溢出,需配合 BigInteger)。
基础版本(int 类型,仅适用于 n ≤ 12):
public static int factorialIterative(int n) {
if (n < 0) throw new IllegalArgumentException("阶乘不支持负数");
int result = 1;
for (int i = 2; i <= n; i++) {
result *= i;
}
return result;
}安全版本(使用 BigInteger,支持任意大小的非负整数):
立即学习“Java免费学习笔记(深入)”;
import java.math.BigInteger;
<p>public static BigInteger factorialIterative(int n) {
if (n < 0) throw new IllegalArgumentException("阶乘不支持负数");
BigInteger result = BigInteger.ONE;
for (int i = 2; i <= n; i++) {
result = result.multiply(BigInteger.valueOf(i));
}
return result;
}用递归实现阶乘(简洁但有栈深度限制)
递归直接对应数学定义:n! = n × (n−1)!,边界是 0! = 1 或 1! = 1。写法简洁,但 n 过大会导致 StackOverflowError(通常 n > 10000 就风险很高)。
基础递归(int 版本):
public static int factorialRecursive(int n) {
if (n < 0) throw new IllegalArgumentException("阶乘不支持负数");
if (n == 0 || n == 1) return 1;
return n * factorialRecursive(n - 1);
}递归 + BigInteger(避免整数溢出,但仍受栈限制):
import java.math.BigInteger;
<p>public static BigInteger factorialRecursive(int n) {
if (n < 0) throw new IllegalArgumentException("阶乘不支持负数");
if (n == 0 || n == 1) return BigInteger.ONE;
return BigInteger.valueOf(n).multiply(factorialRecursive(n - 1));
}使用时要注意的关键细节
-
输入校验必须做:负数没有阶乘定义,应主动抛出
IllegalArgumentException - 0! 和 1! 都等于 1,这是递归终止条件和循环起始点的依据
-
int/long 类型极易溢出:13! 已超
int范围,21! 超long范围,生产环境建议默认用BigInteger - 递归不是银弹:虽然代码短,但 Java 没有尾递归优化,深度调用开销大,不建议在性能敏感或 n 不确定的场景使用
简单测试示例
可以这样验证两个方法结果一致:
public static void main(String[] args) {
int n = 5;
System.out.println(factorialIterative(n)); // 输出 120
System.out.println(factorialRecursive(n)); // 输出 120
System.out.println(factorialIterative(50)); // 大数也 OK(BigInteger 版)
}


















