递归

迷宫问题(回溯)

递归应用场景和调用机制_数据结构

概念

简单呐的说: 递归就是方法自己调用自己,每次调用时传入不同的变量,递归有助于编程者解决复杂的问题,同时让代码变得简洁.

案例-递归调用机制

打印问题

public static void test(int n){
    if(n>2){
        test(n-1);
    }
    System.out.println("n="+n);
}

递归应用场景和调用机制_java_02

递归应用场景和调用机制_java_03

递归调用规则:

  1. 当程序执行到一个方法时,就会开辟一个独立的空间(栈)

    递归应用场景和调用机制_算法_04 递归应用场景和调用机制_递归算法_05 递归应用场景和调用机制_递归算法_06 递归应用场景和调用机制_算法_07

阶乘问题

//阶乘问题
public static int factorial(int n) {
    if (n == 1) {
        return 1;
    } else {
        return factorial(n - 1) * n; // 1 * 2 * 3
    }
}

斐波那契数列

这个也是可以用这个 递归实现的

经典案例

递归用于解决什么样的问题
  1. 各种数学问题如: 8皇后问题 , 汉诺塔, 阶乘问题, 迷宫问题, 球和篮子的问题(google编程大赛)
  2. 各种算法中也会使用到递归,比如快排,归并排序,二分查找,分治算法等.
  3. 将用栈解决的问题–>第归代码比较简洁
递归需要遵守的重要规则
  1. 执行一个方法时,就创建一个新的受保护的独立空间(栈空间)
  2. 方法的局部变量是独立的,不会相互影响, 比如n变量
  3. 如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据.
  4. 递归必须向退出递归的条件逼近,否则就是无限递归,出现StackOverflowError,死龟了:)
  5. 当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。
案例

球和篮子问题

你有几个同样的球,你希望把它放到几个篮子里。每个篮子有相同的容量。给出int 型的baskets,代表篮子的数量。给出int型的 capacity,代表每个篮子的最大容量。给出int型的balls,表示归类到篮子里的球的数量。返回值是把球归类到篮子里的方式的数量。如果不能完全存放到篮子中,无法划分,返回0。 篮子互不同,所有的球相同。因此,如果2个球放到2个篮子里,你可以采用3种方式,即(0, 2), (1, 1), 或 (2, 0)