来源:https://www.bilibili.com/video/BV1B4411H76f?p=39
一、规则
1、递归过程中,每当执行一个方法时,会创建一个新的受保护的独立空间(栈空间)
2、方法中的变量,即每个空间的数据是独立的,不会相互影响
3、如果方法中使用了引用变量(比如数组),那么这种数据就会被共享
4、整个循环必须向退出递归的条件逼近,否则就会无限循环下去
5、方法执行完毕(或者有return)就会返回,谁调用了这个方法,结果就会给谁。
二、迷宫问题
寻找一条由黑色小球到白色小球的路径,中间阴影部分是墙,没法通过。
三、实现
创建一个二维数组代表整个地图,按照上图,数组的维度应该是[8,7]。在这里用1表示这个位置是墙,用2表示这个位置可以走,用3表示这个位置已经走过了但是个死路。
接下来需要制定一个策略,我们可以按照先向下走,不通再右,再上,再左的策略尝试一下。
1、创建地图
1 public static void main(String[] args) { 2 //创建地图 3 int[][] map = new int[8][7]; 4 5 for (int i = 0; i < 8; i++) { 6 map[i][0] = 1; 7 map[i][6] = 1; 8 } 9 for (int i = 0; i < 7; i++) { 10 map[0][i] = 1; 11 map[7][i] = 1; 12 } 13 map[3][1] = 1; 14 map[3][2] = 1; 15 16 //打印地图 17 for (int i = 0; i < 8; i++) { 18 for (int j = 0; j < 7; j++) { 19 System.out.print(map[i][j]+" "); 20 } 21 System.out.println(); 22 } 23 }
结果
1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 1 1 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1
2、递归走迷宫
1 /** 2 * 地图中,1:墙 2:可以走 3:是个死路 0:没有走过 3 * @param map 地图 4 * @param i 初始位置的行坐标 5 * @param j 初始位置的列坐标 6 * @return 7 */ 8 public static boolean setWay(int[][] map,int i,int j){ 9 if(map[6][5] == 2){ 10 //已经到达目的地了 11 return true; 12 }else { 13 if(map[i][j] == 0){ 14 //如果当前的位置为0,没有走过,可以走 15 map[i][j] = 2; 16 //尝试向下走一步,找到通路了,返回true 17 if(setWay(map,i+1,j)){ 18 return true; 19 }else if(setWay(map,i,j+1)){ 20 //上一步没有找到通路,向右走一步试一下 21 return true; 22 }else if(setWay(map,i-1,j)){ 23 //上一步没有找到通路,向上走一步试一下 24 return true; 25 }else if(setWay(map,i,j-1)){ 26 //上一步没有找到通路,向左走一步试一下 27 return true; 28 }else { 29 //这个路是个死路 30 map[i][j] = 3; 31 return false; 32 } 33 }else { 34 //要么走不通(3),要么是墙(1),要么本次已经过了(2) 35 return false; 36 } 37 } 38 }
结果
1 1 1 1 1 1 1 1 2 0 0 0 0 1 1 2 2 2 0 0 1 1 1 1 2 0 0 1 1 0 0 2 0 0 1 1 0 0 2 0 0 1 1 0 0 2 2 2 1 1 1 1 1 1 1 1