递归是方法自己调用自己的编程,底层核心依赖Java虚拟机栈的栈帧机制,即“先进后出”。
递归= 方法调用自己 + JVM栈帧压栈/弹栈
JVM 为每个线程维护一个 虚拟机栈,栈里存放的是一个个 栈帧。
public class demo{
public static void main(String[] args)
{System.out.println(f(5))
}
//阶乘方法
public static int f(int n){if(n == 1){ return 1;}else{return f(n-1)*n
}
}
}
//输出结果为120;
这是一个先压栈再弹栈的过程。
优点
代码简洁,逻辑符合数学思维
不用手动管理循环状态
缺点(底层根源)
栈帧开销大
每次递归调用都创建栈帧,占用内存。
容易栈溢出(StackOverflowError) ::小计算用递归,大计算换方法。
递归深度太大 → 栈帧太多 → 栈空间耗尽。
效率低于循环
压栈、弹栈需要时间,比普通循环慢。
