前言:如何思考递归问题
当你看到递归时,如果脑子里想着循环,一层层向下调用,一层层回溯,总想着计算机的每一步是怎么做的,这样就会陷入学习递归的思维误区;
正确的做法是什么呢?(屏蔽递归细节)
假设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;
}
}
}
}
愿你孤独的努力都有回报,愿你前行的路上有人陪伴~
一起加油哈😉