前言:如何思考递归问题

当你看到递归时,如果脑子里想着循环,一层层向下调用,一层层回溯,总想着计算机的每一步是怎么做的,这样就会陷入学习递归的思维误区;

正确的做法是什么呢?(屏蔽递归细节)
假设A问题,可以细分为BCD这三个小问题,那么我们就应该考虑BCD这三者怎么解决,然后能解决之后再考虑BCD和A的关系;

例:如果要解决我坐在电影院第几排,那么就可以分成规模更小的问题,然后问题就成为了很多个前一排在哪一排的问题;求解自己在哪一排的思路和前面一排的人求解的思路一样



一、对于递归问题代码怎么编写

1.写出递推公式(找到如何将大问题分解为小问题的规律,基于此写出递推公式)
2.找到终止条件
(注:如果没有终止条件,递归就成为了死龟了😁)

二、迷宫问题

思路:
1.使用一个二维数组代表迷宫,数字1代表墙,2代码通路,3代表死路 ,0代表还未走过
2.走的策略:下-右-上-左
3.如果走到某个点不通,就将该点标记为3;然后返回false,栈顶就会弹出一个方法,所以会回退到上一步

代码

package com.company;

/**
 * @author:抱着鱼睡觉的喵喵
 * @date:2021/2/21
 * @description:
 */
public class Maze {
    public static void main(String[] args) {
        int[][] maze = new int[9][8];
        for (int i = 0; i < 8; i++) {	//数组上下边界设为墙
            maze[0][i] = 1;
            maze[8][i] = 1;
        }
        for (int j = 0; j < 9; j++) { //数组左右边界设为墙
            maze[j][0] = 1;
            maze[j][7] = 1;
        }
        maze[2][2] = 1; 		//额外为迷宫加入两个墙作为障碍
        maze[2][1] = 1;
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j<8; j++) {
                System.out.printf("%d\t",maze[i][j]);
            }
            System.out.println();
        }
        getPath(maze,1,1);
        System.out.println("路径如下:");
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j<8; j++) {
                System.out.printf("%d\t",maze[i][j]);
            }
            System.out.println();
        }
    }

    /**
     * 迷宫的行走策略:下-右-上-左
     * @param map
     * @param x
     * @param y
     * @return
     */
    public static boolean getPath(int[][] map, int x, int y) {
        if (map[7][6] == 2) {
            return true;
        } else {
            if (map[x][y] == 0) {
                map[x][y] = 2;
                if (getPath(map, x+1, y)) {
                    return true;
                } else if (getPath(map, x, y+1)) {
                    return true;
                } else if (getPath(map, x-1, y)) {
                    return true;
                } else if (getPath(map, x, y-1)) {
                    return true;
                } else {
                    map[x][y] = 3;
                    return false;
                }
            } else {
                return false;
            }
        }
    }
}

愿你孤独的努力都有回报,愿你前行的路上有人陪伴~

一起加油哈😉

posted on 2021-02-21 22:54  凸凸大军的一员  阅读(130)  评论(0编辑  收藏  举报