前言
递归的应用很多,例如各种数学问题:8皇后问题,汉洛塔,阶乘问题,迷宫问题,球和篮子的问题.
各种算法中也会使用到递归,比如快排,归并排序,二分查找,分治算法等。
使用java语言编写一个递归小迷宫
/**
* 迷宫
*/
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;
}
// 左右置为1
for (int i = 0; i < 8; i++) {
map[i][0] = 1;
map[i][6] = 1;
}
// 设置挡板,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();
}
}
/**
* 使用递归回溯给小球找路
* @param map 迷宫 表示地图
* @param i 横 i,j表示从地图的哪个位置开始出发(1,1)
* @param j 纵
*约定 当map[i][j] 为0表示该点没有走过 当为1表示墙,2表示通路可以走,3表示该点已经走过,但是走不通
* @return 是否走的通
*/
public static boolean setWay(int[][] map, int i, int j) {
// 通路已找到ok
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;
}
}
}
}
总结
提示:这里对文章进行总结:递归必须趋向接近目标,并且有回溯的触发条件,否则就是死循环。