1. 递归的概念
1.1 文字描述
1.2 图示

2. 递归的应用场景
2.1 递归能解决什么样的问题
2.1.1 各种数学问题
2.1.2 各种算法
2.1.3 解决栈的问
2.2 递归需要遵守的重要规则
- 执行一个方法时,就创建一个新的受保护的独立空间(栈空间)
- 方法的局部变量是独立的,不会相互影响, 比如num变量【num:图示里的变量】
- 如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据.【引用类型变量会都放到
堆内存
里】 - 递归必须向退出递归的条件逼近,否则就是无限递归,出现【
栈溢出
】StackOverflowError,死循环) - 当一个方法执行完毕,或者遇到return,就会返回,
遵守谁调用,就将结果返回给谁
,同时当方法执行完毕或者返回时,该方法也就执行完毕。
3.迷宫回溯
3.1思路分析【图示】

3.2 代码实现
package recursion;
import java.util.Random;
public class MazeBacktracking {
public static void main(String[] args) {
int y = 8;
int x = 7;
int[][] ints = initMap(y, x);
System.out.println("初始化迷宫:");
soutInt(ints);
System.out.println("迷宫回溯后的路径:");
findMapPath(ints, 1, 1, x, y);
soutInt(ints);
}
private static boolean findMapPath(int[][] map, int i, int j, int x, int y) {
if (map[y - 2][x - 2] == 2) {
return true;
} else {
if (map[i][j] == 0) {
map[i][j] = 2;
if (findMapPath(map, i + 1, j, x, y)) {
return true;
} else if (findMapPath(map, i, j + 1, x, y)) {
return true;
} else if (findMapPath(map, i - 1, j, x, y)) {
return true;
} else if (findMapPath(map, i, j - 1, x, y)) {
return true;
} else {
map[i][j] = 3;
return false;
}
} else {
return false;
}
}
}
private static int[][] initMap(int y, int x) {
int[][] map = new int[y][x];
for (int i = 0; i < x; i++) {
map[0][i] = 1;
map[y - 1][i] = 1;
}
for (int j = 0; j < y; j++) {
map[j][0] = 1;
map[j][x - 1] = 1;
}
Random rn = new Random();
int randomY = rn.nextInt(y - 2) + 2;
map[rn.nextInt(y - 2) + 2][rn.nextInt(x-2) + 1] = 1;
map[rn.nextInt(y - 2) + 2][rn.nextInt(x-2) + 1] = 1;
return map;
}
private static void soutInt(int[][] ints) {
for (int[] anInt : ints) {
for (int i : anInt) {
System.out.print(i + " ");
}
System.out.println();
}
}
}