利用递归方法求。
递归三要素
基准条件:n == 0 或 n == 1 时返回 1,防止无限递归。
递归关系:f(n) = n * f(n - 1)
问题规模缩小:每次调用 f(n-1),使问题向基准条件靠近。
当用户输入 5 时,程序输出:
请输入一个数:
5
5的阶乘为:120若输入 0,输出:
0的阶乘为:1每次函数调用都会在内存中创建新的栈帧,直到达到基准条件。
然后逐层返回,完成乘法运算。
递归简洁优雅,但对大 n 可能导致栈溢出(Stack Overflow)(Java 默认栈深度约几千层,n=5 完全安全)。
import java.util.Scanner;
public class Demo22 {
/**
* 使用递归计算 n 的阶乘
* @param n 非负整数
* @return n!
*/
public static long fac(int n) {
// 基准条件:0! = 1, 1! = 1
if (n == 0 || n == 1) {
return 1;
}
// 递归关系:n! = n * (n-1)!
return n * fac(n - 1);
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("请输入一个非负整数:");
int n = in.nextInt();
if (n < 0) {
System.out.println("阶乘仅对非负整数定义!");
} else {
System.out.println(n + "的阶乘为:" + fac(n));
}
in.close();
}
}递归 vs 迭代:
递归代码简洁,逻辑清晰,适合数学定义天然递归的问题(如阶乘、斐波那契、树遍历)。
迭代(循环)效率更高,无栈开销,适合性能敏感或深度大的场景。
尾递归优化:某些语言(如 Scala、Scheme)支持尾递归优化,可将递归转为循环避免栈溢出,但 Java 不支持尾递归优化。
阶乘增长极快:20! ≈ 2.43×10¹⁸ 是 long 能表示的最大阶乘,21! 就会溢出。若需更大阶乘,应使用 BigInteger。