什么是方法递归?
- 方法直接调用自己或者问接调用自己的形式称为方法递归(recursion)。
- 递归做为一种算法在程序设计语言中广泛应用。
递归的形式
- 直接递归:方法自己调用自己。
- 间接递归:方法调用其他方法,其他方法叉回调方法自己。
方法递归存在的问题?
- 递归如果没有控制好终止,会出现递归死铺环,导致栈内存溢出现象。
死循环代码演示如下:
public class RecursionDemo01 { public static void main(String[] args) { test(); } public static void test(){ System.out.println("====test被执行===="); test(); } }
代码演示如下:
public class RecursionDemo02 { public static void main(String[] args) { System.out.println(f(5)); // 120 } public static int f(int n){ if (n == 1){ return 1; }else { return f(n - 1) * n; } } }
递归解决问题的思路:
- 把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
递归算法要素大体可以总结为:
- 递归的方式:f(n) = f(n-1)*n;
- 递归的终结点:f(1)
- 递归的方向必须走向终结点
代码演示如下:
public class RecursionDemo03 { public static void main(String[] args) { System.out.println(f(5)); // 15 } public static int f(int n){ if (n == 1){ return 1; }else { return f(n - 1) + n; } } }
代码演示如下:
/** 目标:猴子吃桃 公式:f(x) - f(x)/2 -1 = f(x+1) 2f(x) - f(x) -2 = 2f(x + 1) f(x) = 2f(x + 1) + 2 求f(1) = ? 终结点:f(10) = 1 递归的方向:合理的 */ public class RecursionDemo04 { public static void main(String[] args) { System.out.println(f(1)); // 1534 } public static int f(int n){ if(n == 10){ return 1; }else { return 2*f(n + 1) + 2; } } }