1. 递归的概念
简单的说:递归就是自己调用自己,每次调用时传入不同的变量。
2. 简单的递归代码实现;
打印问题:递归的调用
package recursion;
public class RecursionTest {
public static void main(String[] args) {
//打印问题
test(4);
}
private static void test(int i) {
if(i>2){
test(i-1);
}
System.out.println("i="+i);
}
}
3. 图解 打印问题的代码
4 递归需要遵守的规则
1.执行一个方法时,就创建一个新的受保护的独立空间(栈空间)
2. 方法的局部变量是独立的,不会相互影响。
3. 如果方法中使用的是引用类型的变量(例如数组),就会共享该引用类型的数据。
4. 递归必须向退出的条件逼近,否则就是无限递归,出现Stack Overflow Error
5. 当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就会将结果返回谁,同时将方法执行完毕或者返回时, 该 方法也就执行完毕了。
5. 迷宫问题
6 代码实现;
package recursion;
public class Migong {
public static void main(String[] args) {
//先创建一个二维数组,模拟迷宫地图
int[][] map=new int[8][7];
//使用1表示墙,上下全部置为1
for (int i = 0; i < 7; i++) {
map[0][i]=1;
map[7][i]=1;
}
//左右全部置W为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("地图的情况");
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 7; j++) {
System.out.print(map[i][j]+" ");
}
System.out.println();
}
//使用递归回溯给小球找路
setWay(map,1,1);
//输出新的地图,小球走过,并标识过得递归
System.out.println("小球走过,并标识过得递归,地图的情况");
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 7; j++) {
System.out.print(map[i][j]+" ");
}
System.out.println();
}
}
/*
1. map 表示地图
2. i j 表示从地图哪个位置开始出发
3. 如果小球能够到达map[6][5] 位置,则说明通路找到了。
4. 约定: 当map[i][j]为0表示该点没有走过;1表示墙,2 表示通路可以走通,3表示该点已经走过,但是走不通
5. 在走迷宫时,需要一个策略 下-》右-》上——》左,如果该点走不通,就回溯
*/
/**
*
* @param map 表示地图
* @param i 从哪个位置位置开始找
* @param j
* @return 如果找到通路,就返回true ,否则返回false
*/
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)){
//向下走
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 {
//如果map[i][j]!=0,可能是1 2 3
return false;
}
}
}
}