递归

递归概念

  • 递归就是方法自己去调用自己本身,每次调用时传入的参数不同;递归有助于解决复杂问题,并且简化代码。

递归解决的问题

  • 可以解决各种数学问题,汉诺塔、迷宫、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

posted on 2022-10-09 18:00  红叶次  阅读(36)  评论(0)    收藏  举报