1. 递归基本介绍
递归就是方法自己调用自己,每次调用时传入不同的变量。
1.1 应用场景
(1)各种数学问题,如:8皇后问题, 汉诺塔, 迷宫问题等。
(2)各种算法,如:快排,归并排序,二分查找,分治算法等。
(3)将用栈解决的问题,改为使用递归,代码更加简洁。
1.2 递归调用规则
(1)当程序执行到一个方法时,就会开辟一个独立的空间(栈)。
(2)每个空间的数据(局部变量)是独立的。但如果使用的是引用类型变量,就会共享该引用类型的数据。
(3)递归的过程中,必须向退出递归的条件靠近,否则就会无限递归。
(4)当一个方法执行完毕,或者遇到return,就会返回。遵循谁调用就将结果返回给谁,同时当方法执行完毕或返回时,该方法也就执行完毕了。
2. 迷宫问题
从起点开始走,找到指定的终点。
/**
* 使用递归回溯给小球找路
* 如果找到map[6][5]表示找到通路
* map[i][j]为0表示没有走过,为1表示墙,为2表示通路,为3表示走过但走不通
* 行走策略:下-右-上-左,走不通就回溯
* @param map 表示地图
* @param i 起点位置的坐标x
* @param j 起点位置的坐标y
* @return 如果找到通路,返回true,否则返回false
*/
public static boolean setWay(int[][] map, int i, int j) {
//找到通路
if (map[6][5] == 2) {
return true;
}
//如果还没有走过
if (map[i][j] == 0) {
map[i][j] = 2;//假设可以走通
if (setWay(map, i + 1, j)) {//向下走
return true;
} else if (setWay(map, i, j + 1)) {//向右走
return true;
} else if (setWay(map, i - 1, j)) {//向上走
return true;
} else if (setWay(map, i, j - 1)) {//向左走
return true;
} else {//死路
map[i][j] = 3;
return false;
}
} else {
//如果该点不是0,则可能是1,2,3
//分别表示:墙不能走,通路不用走,死路不能走
return false;
}
}
public static void main(String[] args) {
//迷宫递归
//使用二维数组模拟迷宫,使用1表示墙
int[][] map = new int[8][7];
//上下全部置为1
for (int i = 0; i < 7; i++) {
map[0][i] = 1;
map[7][i] = 1;
}
//左右全部置为1
for (int i = 0; i < 8; i++) {
map[i][0] = 1;
map[i][6] = 1;
}
//设置挡板
map[3][1] = 1;
map[3][2] = 1;
System.out.println("地图的情况:");
setWay(map, 1, 1);
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 7; j++) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
}