1.1 概述
利用递归可以用简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的重复计算,大大减少了程序的代码量。递归的能力在于用有限的语句来定于对象的无限集合。
简单来说,就是方法自己调用自己,递归可以用于在一些重复逻辑的方法中,可以减少一些重复代码的编写,使程序更简洁。
1.2 递归的注意事项
- 构造方法不能递归
- 递归方法中要确定边界条件(递归的结束条件、方法出口),否则将陷入死循环
- 递归的次数不能过多,否则会抛出java.lang.StackOverflowError: 栈内存溢出错误
1.3 递归的两个必要条件
- 确定边界条件。当边界条件不满足时程序前进,当边界条件满足时程序返回,边界条件可以防止方法无限递归下去。
- 提取重复逻辑,缩小问题规模。一个大型复杂的问题层层分解为与原问题相似的小的问题,抽取出重复逻辑,使用同样的方式来解决子问题。
代码示例:
- 5的阶乘递归实现,5的阶乘:5×4×3×2×1
public class Test{
public static void main(String[] args) {
System.out.println(f(5));
}
public static int f(int n) {
//边界条件
if (1 == n) {
return 1;
}
return n*f(n-1);
}
}
根据内存图分析:
首先main方法进栈,调用f()方法。 判断边界条件n是否为1,如果等于1,返回结果,不等于1继续前进,直到满足边界条件返回结果。
总结
递归就像一群人排着队,要统计这个队伍有多少人,第一个人问下一个人:“你是最后一个人吗?”如果不是最后一个人就继续往下问,一直问到最后一个人为止;当问到最后一个人时,最后一个人说“我是最后一个人,从我这里返回人数”。所以倒数第二个人就是1+1,倒数第三个人是1+(1+1)…一直返回到提问的第一个人结束。