递归的概念以及迷宫问题

打印 上一主题 下一主题

主题 1013|帖子 1013|积分 3039

1、概念

递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。并且递归用到了虚拟机栈

2、能解决的问题

数学问题

  • 八皇后问题
  • 汉诺塔
  • 求阶乘
  • 迷宫问题
  • 球和篮子
各种排序算法
3、规则


  • 方法的变量是独立的,不会相互影响的
  • 如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据
  • 递归必须向退出递归的条件逼近,否则就是无限递归,出现 StackOverflowError
  • 当一个方法执行完毕,或者遇到 return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或
    者返回时,该方法也就执行完毕
4、迷宫问题

思路

  • 用一个二维矩阵代表地图

    • 1代表边界
    • 0代表未做过该地点
    • 2代表走过且能走得通
    • 3代表走过但走不通

  • 设置起点和终点以及每个地点的行走策略

    • 行走策略指在该点所走的方向的顺序,如 下->右->上->左(调用寻找路径的方法,使用递归)

  • 每次行走时假设该点能够走通,然后按照策略去判断,如果所有策略判断后都走不通,则该点走不通
图解
初始地图,假设圆点为终点

 
 如以下->右->上->左的策略,路线如下

 
 代码
  1. public class MiGong {
  2.     //用0表示没有走过的路,用1表示墙
  3.     public static void main(String[] args) {
  4.         int[][] map = new int[8][7];//创建地图
  5.         
  6.         //设置地图的墙体,用1来表示
  7.         for (int i = 0; i < 7; i++){
  8.             map[0][i] = 1;
  9.             map[7][i] = 1;
  10.         }
  11.         for (int i = 0; i < 8; i++){
  12.             map[i][0] = 1;
  13.             map[i][6] = 1;
  14.         }
  15.         map[3][1] = 1;
  16.         map[3][2] = 1;
  17.         System.out.println("迷宫地图:");
  18.         for (int i = 0; i < map.length; i++){
  19.             for (int j = 0; j < map[0].length; 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 < map.length; i++){
  27.             for (int j = 0; j < map[0].length; j++){
  28.                 System.out.print(map[i][j]+" ");
  29.             }
  30.             System.out.println();
  31.         }
  32.     }
  33.     /**
  34.      * 用2表示走过的路,用3表示走过且不能继续走下去的路
  35.      * @param map 表示地图
  36.      * @param i   表示第i行开始找
  37.      * @param j   表示第j列开始找
  38.      * @return    返回true的时候表示可以走,返回false的时候表示不能走
  39.      */
  40.     public static boolean setWay(int[][] map, int i, int j){
  41.         if (map[6][5] == 2){//设map[6][5]这个位置是迷宫终点,当终点为2的时候表示迷宫走通了
  42.             return true;
  43.         }else {
  44.             if (map[i][j] == 0){
  45.                 map[i][j] = 2;
  46.                 //制定策略:下->右->上->左
  47.                 if (setWay(map,i+1,j)){
  48.                     return true;
  49.                 }else if (setWay(map,i,j+1)){
  50.                     return true;
  51.                 }else if (setWay(map,i-1,j)){
  52.                     return true;
  53.                 }else if (setWay(map,i,j-1)){
  54.                     return true;
  55.                 }else {
  56.                     map[i][j] = 3;
  57.                     return false;
  58.                 }
  59.             }else {//非0的情况可能是1、2、3,直接false
  60.                 return false;
  61.             }
  62.         }
  63.     }
  64. }
复制代码
  结果:

 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天津储鑫盛钢材现货供应商

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表