Java递归实现阶乘需包含基准情况(n==0或n==1时返回1)和递归情况(n*factorial(n-1)),否则栈溢出;支持非负整数,但n过大易触发StackOverflowError。

Java 中用递归实现阶乘,核心是把 n! = n × (n−1)! 这个数学定义直接翻译成代码,同时必须设定终止条件(即 0! = 1 或 1! = 1),否则会无限调用导致栈溢出。
递归的基本结构
一个合法的递归方法必须包含两部分:
-
基准情况(Base Case):不调用自身的退出条件,比如
n == 0或n == 1,返回 1 -
递归情况(Recursive Case):调用自身,参数向基准靠近,如
n * factorial(n - 1)
标准实现代码
以下是简洁安全的递归阶乘方法(支持非负整数):
public static long factorial(int n) {
if (n < 0) {
throw new IllegalArgumentException("阶乘不能计算负数");
}
if (n == 0 || n == 1) { // 基准情况
return 1;
}
return n * factorial(n - 1); // 递归调用
}
注意:long 类型最多精确表示到 20!(约 2.43×10¹⁸),超过会溢出。如需更大数,应改用 BigInteger。
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
使用 BigInteger 支持大数
对大于 20 的输入,推荐用 java.math.BigInteger:
import java.math.BigInteger;
<p>public static BigInteger factorial(int n) {
if (n < 0) {
throw new IllegalArgumentException("阶乘不能计算负数");
}
if (n == 0 || n == 1) {
return BigInteger.ONE;
}
return BigInteger.valueOf(n).multiply(factorial(n - 1));
}</p>这样可安全计算 1000! 等超大结果,无溢出风险。
调用示例与验证
在 main 方法中测试:
public static void main(String[] args) {
System.out.println(factorial(5)); // 输出:120
System.out.println(factorial(0)); // 输出:1
System.out.println(factorial(10)); // 输出:3628800
}
运行时注意:输入过大的 n(如 >10000)可能引发 StackOverflowError,因每次递归占用栈帧。生产环境若需极高性能或极大数值,可考虑迭代或尾递归优化(Java 本身不支持尾调用优化,需手动转为循环)。

















