递归
递归概念
- 递归就是方法自己去调用自己本身,每次调用时传入的参数不同;递归有助于解决复杂问题,并且简化代码。
递归解决的问题
- 可以解决各种数学问题,汉诺塔、迷宫、8皇后等;
- 各种算法的递归,快排、归并排序、二分查找、分治算法等。
递归规则
- 执行一个方法时,就创建一个新的受保护的独立栈空间;
- 方法的局部变量时独立的,不会相互影响;
- 如果方法中使用的时引用类型变量,比如数组,则会共享引用型数据;
- 递归必须向退出递归条件接近,否则就会无限递归;
- 一个方法执行完毕后,或者遇到return,就会返回数据,遵守谁调用,就将结果返回给谁。
递归应用-迷宫
上代码
/**
* 迷宫 -- 递归应用
* 迷宫map元素说明
* 1-障碍墙 不可通过
* 0-可通过且未走过
* 2-走过且可通过
* 3-走过且不可通过
* 1:1 起点
* row-1:col-2 终点
*/
public class Maze {
private int[][] map;
private int row;
private int col;
public Maze(int row,int col){
this.row = row;
this.col = col;
this.map = new int[row][col];
this.initMap();
}
/**
* 初始化迷宫地图
*/
private void initMap(){
//迷宫墙壁定义
for (int i=0;i<col;i++){
map[0][i]=1;
map[row-1][i]=1;
}
for (int j=0;j<row;j++){
map[j][0]=1;
map[j][col-1]=1;
}
//迷宫内障碍墙定义
for (int i=1;i<row-1;i++){
for (int j=1;j<col-1;j++){
map[i][j]=Math.random()>0.7?1:0;
}
}
//起点、终点
map[1][1]=0;
map[row-1][col-2]=0;
}
/**
* 查看迷宫地图
*/
public void mazeMap(){
System.out.println("**************************迷宫地图********************************");
for (int[] arr : map){
for (int item : arr){
System.out.printf("%d\t",item);
}
System.out.println();
}
}
/**
* 是否可以通过
* @param map
* @param i
* @param j
* @return
*/
private boolean isRun(int[][] map,int i,int j){
if (map[row-1][col-2]==2){
//到达终点
return true;
}else {
if (map[i][j] == 0){
//未走过该点
map[i][j]=2;
if (isRun(map,i+1,j)){
return true;
}else if (isRun(map,i-1,j)){
return true;
}else if (isRun(map,i,j+1)){
return true;
}else if (isRun(map,i,j-1)){
return true;
}else {
map[i][j]=3;
return false;
}
}else {
return false;
}
}
}
/**
* 开始通过迷宫
*/
public void run(){
if(isRun(this.map,1,1)){
System.out.println("****************可以通过***************");
}else {
System.out.println("****************不能通过***************");
}
}
}
运行结果:2即为通过路线
数据结构相关代码仓库地址:
https://gitee.com/red_leafzsp/structureAlgorithms