定义
递归就是自己调用自己。
递归必须具备的条件
- 子问题与原问题解决的是相同的事
- 不能无限制的调用自身,必须有有效的边界条件可以跳出。
递归调用的底层规则
- 当程序执行一个方法时,就会在底层开辟一个独立的栈
- 每个空间的局部变量是独立的,如果是引用变量,则所有空间共用这个引用变量
- 递归时,当一个方法执行完或者执行
return
语句时,遵守谁调用返回给谁的原则
递归的迷宫实现
利用二维数组实现一个迷宫地图。在地图上,数字1表示迷宫的墙壁,数字0表示还未走的地方。
在程序执行时,数字2表示已经走过的地方,数字3表示此路走过且此路不通。
/**
* 迷宫问题
*
* 1 迷宫墙壁, 2 可走且走过的路, 3 走过且不可走的路, 0 未走的路
*/
public class MazeDemo {
public static void main(String[] args) {
int[][] maze = creatMaze();
//printMaze(maze);
setWay(maze, 1, 1);
printMaze(maze);
}
/**
* 迷宫的创建
*/
public static int[][] creatMaze() {
int[][] maze = new int[8][7];
for(int i = 0; i < 7; i++) {
maze[0][i] = 1;
maze[7][i] = 1;
}
for(int i = 0; i < 8; i++) {
maze[i][0] = 1;
maze[i][6] = 1;
}
maze[3][1] = 1;
maze[3][2] = 1;
return maze;
}
/**
* 迷宫的打印
*/
public static void printMaze(int[][] maze) {
for(int i = 0; i < maze.length; i++) {
for(int j = 0; j< maze[i].length; j++) {
System.out.printf("%d\t", maze[i][j]);
}
System.out.println();
}
}
/**
* 迷宫查找路径
* 从(1,1)到(6,5)
* 上——》右——》下——》左
*/
public static boolean setWay(int[][] maze, int row, int col) {
if(maze[6][5] == 2) {
return true;
} else {
if(maze[row][col] == 0) {
maze[row][col] = 2;
if(setWay(maze, row - 1, col)) {
return true;
} else if(setWay(maze, row, col + 1)) {
return true;
} else if(setWay(maze, row + 1, col)) {
return true;
} else if(setWay(maze, row, col - 1)) {
return true;
} else {
maze[row][col] = 3;
return false;
}
} else {
return false;
}
}
}
}
递归实现八皇后问题
在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
/**
* 8皇后问题
*/
public class Queen {
final static int max = 8;
private static int[] arr = new int[max];
private static int count = 0;
public static void main(String[] args) {
check(0);
System.out.println("共有" + count + "中方法");
}
/**
* 打印一种情况
*/
public static void printOne() {
count++;
for(int i = 0; i < arr.length; i++) {
System.out.printf("%d\t", arr[i]);
}
System.out.println();
}
/**
* 判断是否符合第n个皇后是否的条件
*/
public static boolean Judge(int n) {
for(int i = 0; i < n; i++) {
//arr[i] == arr[n] 判断是否处于 同一列
//Math.abs(n - i) == Math.abs(arr[n] - arr[i]) 判断是否处于同一斜线
if(arr[i] == arr[n] || Math.abs(n - i) == Math.abs(arr[n] - arr[i])) {
return false;
}
}
return true;
}
/**
* 获取所有的问题解法
*/
public static void check(int n) {
if(n == max) {
printOne();
return;
} else {
for(int i = 0; i < max; i++) {
arr[n] = i;
if(Judge(n)) {
check(n + 1);
}
}
}
}
}