什么是递归?
简单的说就是自己调用自己,每次传入不同的变量
作用就是有助于程序员解决复杂的问题
递归可以解决什么问题?
- 各种数学问题:八皇后问题,汉若塔,阶乘问题,迷宫问题
- 各种算法中:比如快速排序、归并排序
- 用于栈解决问题
递归需要遵守的重要规则
- 执行一个方法时,就创建一个新的受保护的独立空间(栈空间)
- 方法的局部变量是一个独立的,不会相互影响
- 如果方法中使用的是引用类型的变量,就会共享该引用类型的数据
- 递归必须向退出递归的条件逼近,否则就是无限递归,出现StackOverFlowError
- 当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。
迷宫问题代码实现
构建迷宫方法:
public static int[][] miGong(int row,int clum){
int[][] map=new int[row][clum];
// 用1作为迷宫的墙
// 上下墙
for (int i = 0; i < clum; i++) {
map[0][i]=1;
map[clum][i]=1;
}
// 左右墙
for (int i = 0; i < row; i++) {
map[i][0]=1;
map[i][clum-1]=1;
}
// 挡板
map[4][1]=1;
map[4][2]=1;
return map;
}
通过回溯找到迷宫的路:
public static boolean setWay (int[][] map,int i,int j){
if (map[6][5]==2){
return true;
}else{
// 还没有走的路
if (map[i][j]==0){
map[i][j]=2;
// 从这个点出发向下走
if (setWay(map, i + 1, j) ||
setWay(map, i, j + 1) ||
setWay(map, i - 1, j) ||
setWay(map, i, j - 1)) {
return true;
} else {
// 走不通
map[i][j]=3;
return false;
}
}else {
return false;
}
}
}
构建一个八行七列的迷宫,找到迷宫的出路:
public static void main(String[] args) {
int[][] map=miGong(8,7);
// 创建迷宫
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 7; j++) {
System.out.print(map[i][j]+" ");
}
System.out.println();
}
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();
}
}
运行结果: