递归
一、概述
- 递归就是方法自己调用自己,每次调用时传入不同的变量,**递归有助于编程者解决复杂的问题,**同时可以让代码变得简洁
1. 递归的调用机制
1.1 打印问题
public class RecursionTest {
public static void main(String[] args) {
test(4);
}
public static void test(int n){
if(n>2){
test(n-1);
}
System.out.println("n="+n);
}
}
1.2 阶乘问题
public class RecursionTest {
public static void main(String[] args) {
int res = factorial(3);
System.out.println("res="+res);
}
/**
* 阶乘问题
* @param n
* @return
*/
public static int factorial(int n){
if(n==1){
return 1;
}else{
return factorial(n-1)*n;
}
}
}
2. 递归的重要规则
- 执行一个方法时,就创建一个新的受保护的独立空间**(栈空间)**
- 方法的局部变量是独立的,不会相互影响。
- 如果方法时引用类型变量(比如数组),就会共享该引用类型的数据
- 递归必须向退出递归的条件逼近,否则就是无限递归,会出现StackOverflowError
- 当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕
二、递归的应用
- 八皇后问题、汉诺塔、阶乘、迷宫…
- 各种算法会使用到递归:快排、归并排序、二分查找、分治算法
- 使用栈解决的问题可以使用递归解决
1. 迷宫问题概述
说明:
- 小球得到的路径和程序员设置的找路策略有关,即:找路的上下左右顺序相关
- 如何求最短路径
2. 代码演示
说明:
- map表示地图
- i,j表示从地图的那个位置出发(1,1)
- 如果小球能到达map[6] [5]位置,则说明通路找到
- 约定:当map[i] [j]为0表示该点没有走过、1表示墙、2表示通路、3表示该点已经走过,但是走不通
- 走迷宫时需要确定策略,例如:下—>右—>上—>左,如果该点走不通则回溯
/**
* @author DELL
* @Date 2020/1/30 18:42
**/
public class Maze_Problem {
public static void main(String[] args) {
//使用数组代替迷宫
int[][] map = new int[8][7];
//初始化map
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;
//调用小球探路的方法
setWay(map,1,1);
//打印地图
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 7; j++) {
System.out.print(map[i][j]+" ");
}
System.out.println();
}
}
/**
* @param map
* @param i
* @param j
* @return 如果找到通路则返回true,否则返回false
*/
public static boolean setWay(int[][] map,int i,int j){
if(map[6][5]==2){
return true;
}else{
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{//map[i][j]!=0
return false;
}
}
}
}
来源:CSDN
作者:Yun ShuaiWei
链接:https://blog.csdn.net/qq_40613029/article/details/104122680