java中递归实现阶乘和斐波那契需明确终止条件与递推关系:阶乘为n!=n×(n−1)!且0!=1,斐波那契为f(0)=0、f(1)=1、f(n)=f(n−1)+f(n−2);二者均简洁但存在栈溢出与性能问题。

Java 中用递归实现阶乘和斐波那契数列,核心是明确终止条件和递推关系,写法简洁但要注意性能和栈溢出风险。
阶乘的递归实现
阶乘定义:n! = n × (n−1)!,且 0! = 1。递归函数需处理边界(n = 0 或 n = 1)并调用自身计算更小规模子问题。
示例代码:
public static long factorial(int n) {
if (n 说明:
- n 为 0 或 1 时直接返回 1,避免无限递归
- 使用 long 类型可支持到约 20!;超过会溢出,如需更大数可用 BigInteger
- 不建议对大 n(如 n > 10000)使用递归,易触发 StackOverflowError
斐波那契数列的递归实现
斐波那契定义:F(0)=0,F(1)=1,F(n)=F(n−1)+F(n−2)(n ≥ 2)。同样依赖终止条件和自身调用。
基础版本:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
public static int fib(int n) {
if (n 注意:
- 该写法时间复杂度为 O(2ⁿ),存在大量重复计算(如 fib(3) 被多次调用)
- 仅适合教学或小数值(n ≤ 40),实际项目中应改用迭代或记忆化递归
- 若需支持较大 n,推荐用 long 或 BigInteger 防止溢出
优化建议:带记忆化的斐波那契递归
用数组或 Map 缓存已算结果,避免重复计算,将时间复杂度降至 O(n)。
简易记忆化示例(使用数组):
public static long fibMemo(int n) {
if (n private static long fibHelper(int n, long[] memo) {
if (n == 0) return 0;
if (n == 1) return 1;
if (memo[n] != 0) return memo[n]; // 已计算过,直接返回
memo[n] = fibHelper(n - 1, memo) + fibHelper(n - 2, memo);
return memo[n];
}说明:
- 首次调用 fibMemo(n) 初始化缓存数组,再委托给辅助方法
- 每次计算前检查 memo[n] 是否非零,跳过重复递归分支
- 空间复杂度 O(n),但显著提升效率,n=50 也能瞬时完成
递归使用的注意事项
递归虽直观,但在 Java 中需谨慎使用:
- 务必定义清晰、可达的终止条件,否则导致无限递归和栈溢出
- 递归深度受 JVM 栈大小限制(默认通常几千层),深递归建议改用循环
- 函数调用开销比循环略大,高频或性能敏感场景优先选迭代
- 调试递归逻辑时,可在关键位置加日志(如打印当前 n 值),便于跟踪执行路径
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










