🧡数据结构与算法🧡从零到有系列《五》递归

210 阅读3分钟

这是我参与8月更文挑战的第17天,活动详情查看:8月更文挑战

上一篇说到了数据结构与算法中稀疏数组和队列今天这篇文章主要来说说递归

💢递归

1. 递归概念

递归就是方法自己去调用自己,每次调用时传入的参数是不同的,递归有助于解决程序中复杂的问题,同时可以让代码更为简洁。

2. 递归解决的问题

1、 可以解决各种数学问题,汉若塔,迷宫问题, 8皇后问题等等

2、 各种算法的递归,如快排,归并排序,二分查找,分治算法等  

3. 递归的规则

1、执行一个方法时,就创建一个新的受保护的独立栈空间

2、方法的局部变量是独立的,不会相互影响。

3、如果方法中使用的是引用型类型变量,比如数组,则会共享引用型的数据

4、递归必须向退出递归的条件接近,否则就是无线递归,会出现StackOverflowError。

5、一个方法执行完毕后,或者遇到return,会就返回数据,遵守谁调用就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。

4. 递归(迷宫问题)

image.png

/**

 * author:韩国庆

 * date:2021/2/27 16:46

 * version:1.0

 */

public class Maze {.

public static void main(String[] args) {

        int[][] map = new int[8][7];

 

        /**

         * 使用编号1表示上下左右都是墙

         */

        for (int i=0;i<7;i++){

            map[0][i] = 1;

            map[7][i] = 1;

        }

 

        for (int i=0;i<8;i++){

            map[i][0] = 1;

            map[i][6] = 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();

        }

 

        getRoute(map,1,1);
        
        //getRoute2(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();

        }

 

 

    }

/**

     * 回溯思想

     * 1、map对象表示地图

     * 2、i和j表示从那个位置出发 (1,1)

     * 3、如果小球能到map[6][5]位置,则说明通路已经找到

     * 4、当map[i][j]为0时,表示该点没有走过,当为1时表示墙,当时2时表示通过可以走,当时3时该点已经走过,

     * 但是走不通。

     * 5、走迷宫时,需要确定一个策略方法,下,右,上,左,如果该点走不通再回溯。

     *

     */

    public static boolean getRoute(int[][] map,int i,int j){

        if (map[6][5] == 2){

            return true;

        }else {

 

    if (map[i][j] == 0){//如果没有走过该点

                //按照策略走,下,右,上,左

                map[i][j] = 2;

                if (getRoute(map,i+1,j)){ //往下走

                    return true;

                }else if (getRoute(map,i,j+1)){ //往右走

                    return true;

                }else if (getRoute(map,i-1,j)){

                    return true;

                }else if (getRoute(map,i,j-1)){

                    return true;

                }else {

                    //说明该路是死路,走不通

                    map[i][j] = 3;

                    return false;

                }

 

            }else {//如果map[i][j]不是0,而是1,2,3呢

                return false;

            }

        }

 

    }

 

    public static boolean getRoute2(int[][]map,int i,int j){

        if (map[6][5] == 2){

            return true;

        }else{

            if (map[i][j] == 0){//表示该路没有走过

                map[i][j] = 2;//假设该点是可以通走的

               if (getRoute(map,i-1,j)){//上

                    return true;

                }else if (getRoute(map,i,j+1)){//右

                    return true;

                }else if (getRoute(map,i+1,j)){//下

                    return true;

                }else if (getRoute(map,i,j-1)){//左

                    return true;

                }else {

                    //说明该路是死路,走不通过

                    map[i][j] = 3;

                    return false;

                }

 

            }else {

                //如果map[i][j] 不是0,而是1,2,3

                return false;

            }

        }

 

    }

 

 

}