一:递归的特点
递归就是方法自己调用自己,每次调用的时候传入不同的变量,递归有助于解决复杂的问题,同时可以让代码变的更加简洁。
如递归中的打印问题和阶乘问题。
factorial实体类
package com.recursion;
/**
* @author lizhangyu
* @date 2021/3/10 20:08
*/
public class factorial {
public static void main(String[] args) {
int res = fac(5);
System.out.println(res);
test(5);
}
public static int fac(int n) {
if (n == 1) {
return 1;
}else {
return fac(n-1) * n;
}
}
public static void test(int n) {
if (n > 1) {
test(n-1);
}
System.out.println(n);
}
}
迷宫问题的实现:
MiGong实体类
package com.recursion;
/**
* @author lizhangyu
* @date 2021/3/10 20:54
*/
public class MiGong {
public static void main(String[] args) {
int[][] map = new int[8][7];
for (int i = 0; i < 8; i++) {
map[i][0] = 1;
map[i][6] = 1;
}
for (int j = 0; j < 7; j++) {
map[0][j] = 1;
map[7][j] = 1;
}
map[3][1] = 1;
map[3][2] = 1;
System.out.println("初始化的地图map:");
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 7; j++) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
Boolean isTrue = setWay(map, 1, 1);
// Boolean isTrue = setWay2(map, 1, 1);
System.out.println(isTrue);
System.out.println("走过后的地图map:");
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 7; j++) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
}
/**
* 当map[i][j] = 0时,表示该点没有走过,当为1表示为墙,当为2表示通路可以走通,当为3表示该点已经走过,但是走不通
* 走路策略 下-右-上-左
* @param map
* @param i
* @param j
* @return
*/
public static boolean setWay(int[][] map, int i, int j) {
//递归结束的条件
if (map[6][5] == 2) {
return true;
}
if (map[i][j] == 0) {
//表示该点可以走通
map[i][j] = 2;
if (setWay(map, i+1, j)) {
return true;
}else if (setWay(map, i, j+1)) {
return true;
}else if (setWay(map, i-1, j)) {
return true;
}else if (setWay(map, i, j-1)) {
return true;
}else {
//表示走不通了
map[i][j] = 3;
return false;
}
}else {
return false;
}
}
/**
* 当map[i][j] = 0时,表示该点没有走过,当为1表示为墙,当为2表示通路可以走通,当为3表示该点已经走过,但是走不通
* 走路策略 上-左-下-右
* @param map
* @param i
* @param j
* @return
*/
public static boolean setWay2(int[][] map, int i, int j) {
//递归结束的条件
if (map[6][5] == 2) {
return true;
}
if (map[i][j] == 0) {
//表示该点可以走通
map[i][j] = 2;
if (setWay2(map, i-1, j)) {
return true;
}else if (setWay2(map, i, j-1)) {
return true;
}else if (setWay2(map, i+1, j)) {
return true;
}else if (setWay2(map, i, j+1)) {
return true;
}else {
//表示走不通了
map[i][j] = 3;
return false;
}
}else {
return false;
}
}
}
运行结果:
下-右-上-左走法的结果
初始化的地图map:
1 1 1 1 1 1 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 1 1 0 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 1 1 1 1 1 1
true
走过后的地图map:
1 1 1 1 1 1 1
1 2 0 0 0 0 1
1 2 2 2 0 0 1
1 1 1 2 0 0 1
1 0 0 2 0 0 1
1 0 0 2 0 0 1
1 0 0 2 2 2 1
1 1 1 1 1 1 1
上-左-下-右走法的结果
初始化的地图map:
1 1 1 1 1 1 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 1 1 0 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 1 1 1 1 1 1
true
走过后的地图map:
1 1 1 1 1 1 1
1 2 2 2 2 2 1
1 2 2 2 2 2 1
1 1 1 2 2 2 1
1 2 2 2 2 2 1
1 2 2 2 2 2 1
1 2 2 2 2 2 1
1 1 1 1 1 1 1