1、源码

  1. package com.study.recursion;
  2. public class MiGong {
  3. public static void main(String[] args) {
  4. //创建一个二维数组模拟迷宫
  5. int[][] map = new int[8][7];
  6. // 1 表示墙
  7. //将第一行和第八行全部置为1
  8. for (int i = 0; i < 7; i++) {
  9. map[0][i] = 1;
  10. map[7][i] = 1;
  11. }
  12. //将第一列和第七列全部置为1
  13. for (int i = 0; i < 8; i++) {
  14. map[i][0] = 1;
  15. map[i][6] = 1;
  16. }
  17. //将第四行第二列和第四行第三列置为1;
  18. map[3][1] = 1;
  19. map[3][2] = 1;
  20. //遍历数组
  21. System.out.println("迷宫为:");
  22. for (int i = 0; i < 8; i++) {
  23. for (int j = 0; j < 7; j++) {
  24. System.out.print("\t"+map[i][j]);
  25. }
  26. System.out.println();
  27. }
  28. setWay(map,1,1);
  29. System.out.println("小球走出后的迷宫:");
  30. for (int i = 0; i < 8; i++) {
  31. for (int j = 0; j < 7; j++) {
  32. System.out.print("\t"+map[i][j]);
  33. }
  34. System.out.println();
  35. }
  36. }
  37. /**
  38. * 使用递归回溯来给小球找路
  39. * 说明:
  40. * 1.map表示地图
  41. * 2.i,j表示从地图哪个位置出发(1,1)
  42. * 3.如果小球能到map[6][5],说明小球找到通路
  43. * 4.约定:当map[i][j] 为0表示该点没有走过,为1表示墙,为2表示通路可以走,为3表示该点已经走过,但是不通
  44. * 5.在走迷宫时需要制定一个策略(方法):下->右->上->左,如果该点走不通,在回溯
  45. * @param map 表示地图
  46. * @param i 从哪个位置开始走
  47. * @param j
  48. * @return 如果是通路,返回true,否则返回false;
  49. */
  50. public static boolean setWay(int[][] map,int i,int j){
  51. if (map[6][5] == 2){//通路已经找到
  52. return true;
  53. }else {
  54. if (map[i][j]==0){//表示该点没有走过
  55. map[i][j] = 2;
  56. if (setWay(map, i+1, j)){//向下走
  57. return true;
  58. }else if(setWay(map, i, j+1)){//向右走
  59. return true;
  60. }else if(setWay(map, i-1, j)){//向上走
  61. return true;
  62. }else if(setWay(map, i, j-1)){//向左走
  63. return true;
  64. }else {
  65. map[i][j] = 3;
  66. return false;
  67. }
  68. }else {//如果map[i][j]!=0,可能是1,2,3
  69. return false;
  70. }
  71. }
  72. }
  73. }

2、运行结果

图片.png

3、总结

递归需要遵守的重要规则

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