原文地址:https://blog.csdn.net/guorui_java/article/details/106230186

一、简介

递归就是方法自己调用自己,每次调用时传入不同的参数,递归有利于编程者解决复杂的问题,同时可以让代码变得简洁。

二、用一个例子引出递归概念

  1. public static void test(int n){
  2. if(n>2){
  3. test(n-1);
  4. }
  5. System.out.println("n="+n);
  6. }

打眼一看,很low,很简单,4,3,2无疑。
为了验证我的聪明才智,输出一把吧
7.递归之迷宫问题 - 图1

三、递归调用规则(很重要)

1、执行一个方法时,就创建一个新的受保护的独立空间(栈空间);
2、方法的局部变量是独立的,不会相互影响,比如变量n;
3、如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据;
4、递归必须向退出递归的条件逼近,否则就是无限递归,StackOverflowError;
5、当一个方法执行完毕,或遇到return,就会返回,遵守谁调用就将结果返回给谁,同时当方法执行完毕或return时,该方法也就执行完毕。
7.递归之迷宫问题 - 图2

四、递归能解决什么样的问题

4.1 各种数学问题

比如八皇后问题、哈诺塔、阶乘问题、迷宫问题、球和篮子的问题(Google编程大赛)。

4.2 各种算法中也会使用递归

比如快排、归并排序、二分查找、分治算法。

4.3 栈解决的问题都可以用递归

代码更加简洁。

五、迷宫问题

7.递归之迷宫问题 - 图3

5.1 代码实现

  1. package dataStructure.recursion;
  2. public class Labyrinth {
  3. public static void main(String[] args) {
  4. //迷宫问题
  5. //0 表示该点没有走过 当为 1 表示墙 ; 2 表示通路可以走 ; 3 表示该点已经走过,但是走不通
  6. int[][] map = new int[8][7];
  7. for(int i=0;i<8;i++){
  8. for (int j = 0; j < 7; j++) {
  9. map[0][j] = 1;
  10. map[7][j] = 1;
  11. map[i][0] = 1;
  12. map[i][6] = 1;
  13. }
  14. }
  15. //设置挡板, 1 表示
  16. map[3][1] = 1;
  17. map[3][2] = 1;
  18. for (int i = 0; i < 8; i++) {
  19. for (int j = 0; j < 7; j++) {
  20. System.out.print(map[i][j]+" ");
  21. }
  22. System.out.println();
  23. }
  24. setWay(map,1,1);
  25. System.out.println("迷宫走过之后地图");
  26. for (int i = 0; i < 8; i++) {
  27. for (int j = 0; j < 7; j++) {
  28. System.out.print(map[i][j]+" ");
  29. }
  30. System.out.println();
  31. }
  32. }
  33. //使用递归回溯来给小球找路
  34. //说明
  35. //1. map 表示地图
  36. //2. i,j 表示从地图的哪个位置开始出发 (1,1)
  37. //3. 如果小球能到 map[6][5] 位置,则说明通路找到.
  38. //4. 约定: 当map[i][j] 为 0 表示该点没有走过 当为 1 表示墙 ; 2 表示通路可以走 ; 3 表示该点已经走过,但是走不通
  39. //5. 在走迷宫时,需要确定一个策略(方法) 下->右->上->左 , 如果该点走不通,再回溯
  40. private static boolean setWay(int[][] map,int i,int j){
  41. if(map[6][5] == 2){
  42. return true;
  43. }else{
  44. if(map[i][j]==0){
  45. map[i][j] = 2;
  46. if(setWay(map,i+1,j)){//下
  47. return true;
  48. }else if(setWay(map,i,j+1)){//右
  49. return true;
  50. }else if(setWay(map,i-1,j)){//上
  51. return true;
  52. }else if(setWay(map,i,j-1)){//左
  53. return true;
  54. }else{
  55. map[i][j] = 3;
  56. return false;
  57. }
  58. }else {
  59. return false;
  60. }
  61. }
  62. }
  63. }

5.2 控制台输出

7.递归之迷宫问题 - 图4
注:1表示墙,2表示你走的路,0表示没走的路。
这个还是挺简单的!