- 递归是一种算法结构
- 回溯是一种算法思想
递归调用规则
- 当程序执行到一个方法时,就会开辟一个独立的空间(栈)
- 每个空间的数据(局部变量)是独立的。
递归需要遵守的重要规则
- 执行一个方法时,就创建一-个新的受保护的独立空间(栈空间)。
- 方 法的局部变量是独立的,不会相互影响。
- 如果 方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据。
- 归必须向退出递归的条件逼近,否则就是无限递归,出现StackOverflowError。
- 当一个方法执行完毕,或者遇到return, 就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。
迷宫问题–递归
package Eccorsion;
/**
* @ClassName: MiGong
* @Description: 迷宫数字化
* 8行7列
* 1为墙壁
* 0为可行走位置
* 2为走过的位置
* 3为断路
* 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
* @author author
* @date 2020-08-14
*/
public class MiGong {
public static void main(String[] args) {
// 創建迷宮8行7列
int[][] Array = new int[8][7];
int t = 0;
// 設置上下邊界
for (int i = 0; i < 7; i++) {
Array[0][i] = 1;
Array[7][i] = 1;
}
// 設置左右邊界
for (int i = 0; i < 8; i++) {
Array[i][0] = 1;
Array[i][6] = 1;
}
Array[3][1] = 1;
Array[3][2] = 1;
// 打印地圖
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 7; j++) {
System.out.print(Array[i][j] + " ");
}
System.out.println();
}
System.out.println("迷宫通路");
setWay(Array, 1, 1);
// 打印迷宫通路
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 7; j++) {
System.out.print(Array[i][j] + " ");
if (Array[i][j] == 2) {
t++;
}
}
System.out.println();
}
System.out.println("所需步数" + t);
}
/**
*
* @Title: setWay
* @Description: 调用递归回溯来找出路
* @param Array 地图
* @param i 行
* @param j 列 迷宫行走策略:下->右->上->左
* @return boolean
*/
public static boolean setWay(int Array[][], int i, int j) {
if (Array[6][5] == 2) {
// 通路结束
return true;
} else {
if (Array[i][j] == 0) {
// 假设能走通
Array[i][j] = 2;
// 递归回溯 向下走
if (setWay(Array, i + 1, j)) {
return true;
}
// 不能向下便向右
else if (setWay(Array, i, j + 1)) {
return true;
}
// 不能向右便向上
else if (setWay(Array, i - 1, j)) {
return true;
}
// 不能向上便向左
else if (setWay(Array, i, j - 1)) {
return true;
} else {
// 不能走通
Array[i][j] = 3;
return false;
}
} else {
// Array[i][j]!=0 可以是1(边界)2(通路)3(死路)
return false;
}
}
}
}
对迷宫问题的讨论与总结
1.迷宫通路的选择与程序设置的找路策略有关,即路的上下左右顺序有关