Java递归寻路实现,你真的理解了吗

作者:森森子_ 时间:2022-09-17 02:24:34 

Java递归寻路实现,你真的理解了吗

看懂这张图,方法调用方法,栈开新栈,递归尾结束要回到main栈,必须一级一级返回,每一次返回都是调用整个方法,调用完成栈被释放,直至回到栈底main递归结束并能够自己画出来,理解递归的运行机制,这是我手画的,不好看,你的呢,还不动起来

Java递归寻路实现,你真的理解了吗

到这,如果上面的你都理解了,那么我相信你可以用递归写出 计算 n 的阶乘的程序了,什么,写不出,没有关系,我来补上,一定要理解在栈里运行机制

使用递归计算阶乘


public class Factorial {
   public static void main(String[] args) {
       Factorial  jie = new Factorial ();
       System.out.println(jie.f(3));
   }
   public int f(int n){
       if(n == 1){
           return 1;
       }else {
           return n*f(n-1);
       }
   }
}

接下来就可以玩起来了,一个有趣的迷宫问题,假设有如下二维数组表示地图,数字1表示围墙,数字0表示可以走,现在有只小老鼠被困在下标为[1][1]的位置,出口在下标为[6][5]的位置,思考:使用递归如何让小老鼠寻路逃生呢?

Java递归寻路实现,你真的理解了吗

思考过后,脑袋是不是蒙蒙的

想要玩起来

地图创建

思路

1. 先创建迷宫,用二维数组表示 int[][] map = new int[8][7];
2. 规定 map:0 表示可以走,1表示墙不能走

1,打印二维数组


public class miGong {
   public static void main(String[] args) {
       int[][] map = new int[8][7];
       for (int i = 0; i < map.length; i++) {
           for (int j = 0; j < map[i].length; j++) {
               System.out.print(map[i][j]+" ");
           }
           System.out.println();
       }
   }
}

Java递归寻路实现,你真的理解了吗

2,规定墙和可以走的,只需要通过遍历指定行和列,再把两个特别的单独强调,完成


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;

实现效果:

Java递归寻路实现,你真的理解了吗

核心

这时就完成了地图,思考如何使用递归寻路呢

开始吧,写一个方法,通过递归来实现寻路,我直接放代码了

  • 首先,创建一个类,写findWay方法,返回值是boolean,三个参数,分别是地图,二维坐标x,y用来确定位置

  • 接着,我们判断如果map[6][5] == 2,就认为小老鼠找到出口了,这点很重要,它是递归回调条件

  • 如果map[6][5] == 2条件为假,说明小老鼠没有找到出口,调用方法时初始化开始坐标,接着map[i][j] = 2;假设可以走通就把坐标的值修改为2,表示老鼠走的痕迹

  • 接下来,奇妙的事情发生了,递归就在这里开始了,我们调用自己findWay传入参数,我们先确定下来小老鼠的行走轨迹,假设是下-右-上-左,我们通过修改数组下标来表示小老鼠的移动,假设上下左右都没能走通,就把坐标值修改为3,表示小老鼠被困死了,返回false,失败,🆗,代码已经完成

  • 小伙伴:什么???完成了???


class way{
   //使用递归回溯的思想来解决
   public boolean findWay(int[][] map,int i,int j){
      if(map[6][5] == 2){
          return true;
      }else{
          if(map[i][j] == 0){
              //假定可以走通
              map[i][j] = 2;
              //下-右-上-左
              if(findWay(map,i+1,j)){//下
                  return true;
              }else if(findWay(map,i,j+1)){//右
                  return true;
              }else if(findWay(map,i-1,j)){//上
                  return true;
              }else if(findWay(map,i,j-1)){//左
                  return true;
              }else {
                  map[i][j] = 3;
                  return false;
              }
          }else {
              return false;
          }
      }
   }
}

主函数调用,查看结果:


way f = new way();
       f.findWay(map,1,1);
       System.out.println("=====找路=====");
       for (int i = 0; i < map.length; i++) {
           for (int j = 0; j < map[i].length; j++) {
               System.out.print(map[i][j]+" ");
           }
           System.out.println();
       }

运行代码查看结果:

Java递归寻路实现,你真的理解了吗

看到成功寻路逃生~~~,是不是还很疑惑

Java递归寻路实现,你真的理解了吗

一定要理解透,你也可以设置死路,只要上面的理解了,达到能在脑子里快速回放递归的过程,栈开栈,栈销毁,等等,你就可以随便玩了,之前是不是一直不理解为什么说递归占用空间,谨慎使用,这下就明明白白了,好了,多理解理解,这就是所有内容,感受到递归的魅力了吗?哈哈 是不是很好玩,体会这种思想,感谢观看

完整代码


public class miGong {
   public static void main(String[] args) {
       //思路
       //1.先创建迷宫,用二维数组表示 int[][] map = new int[8][7];
       //2.规定 map:0 表示可以走,1表示墙不能走
       int[][] map = new int[8][7];
       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;
       //打印
       for (int i = 0; i < map.length; i++) {
           for (int j = 0; j < map[i].length; j++) {
               System.out.print(map[i][j]+" ");
           }
           System.out.println();
       }
       way f = new way();
       f.findWay(map,1,1);
       System.out.println("=====找路=====");
       for (int i = 0; i < map.length; i++) {
           for (int j = 0; j < map[i].length; j++) {
               System.out.print(map[i][j]+" ");
           }
           System.out.println();
       }
   }
}
class way{
   //使用递归回溯的思想来解决
   public boolean findWay(int[][] map,int i,int j){
      if(map[6][5] == 2){
          return true;
      }else{
          if(map[i][j] == 0){
              //假定可以走通
              map[i][j] = 2;
              //下-右-上-左
              if(findWay(map,i+1,j)){//下
                  return true;
              }else if(findWay(map,i,j+1)){//右
                  return true;
              }else if(findWay(map,i-1,j)){//上
                  return true;
              }else if(findWay(map,i,j-1)){//左
                  return true;
              }else {
                  map[i][j] = 3;
                  return false;
              }
          }else {
              return false;
          }
      }
   }
}

来源:https://blog.csdn.net/m0_53321320/article/details/119888312

标签:Java,递归,实现
0
投稿

猜你喜欢

  • java实现二分法的完整代码

    2023-08-18 22:09:06
  • 使用spring框架实现数据库事务处理方式

    2022-03-01 14:38:13
  • Spring Boot配置AOP打印日志的全过程

    2023-08-07 12:56:38
  • Java双冒号(::)运算符使用详解

    2022-03-31 11:18:17
  • Java文件操作工具类fileUtil实例【文件增删改,复制等】

    2023-11-28 08:39:00
  • C++ Boost MPI接口详细讲解

    2023-11-02 13:35:36
  • 解析Java线程同步锁的选择方法

    2023-02-08 11:02:32
  • SpringBoot用@Async注解实现异步任务

    2023-08-07 06:36:09
  • springboot实现定时任务的四种方式小结

    2021-10-20 20:38:06
  • Java程序员面试中的多线程问题总结

    2021-12-12 07:48:33
  • java中transient关键字用法分析

    2022-01-22 04:27:05
  • 浅谈java多线程wait,notify

    2023-11-29 16:29:03
  • Java 中Comparable和Comparator区别比较

    2023-10-28 23:16:34
  • SpringMVC数据响应详细介绍

    2023-09-24 04:12:41
  • java对象初始化代码详解

    2023-09-19 13:59:01
  • 花样使用Handler与源码分析

    2023-07-30 08:36:31
  • Java聊天室之使用Socket实现传递对象

    2023-02-07 15:28:52
  • C++语言io流处理基本操作教程示例

    2023-11-02 22:07:39
  • 详解idea maven nexus 常见命令配置

    2021-06-07 18:29:03
  • Spring Bean生命周期之BeanDefinition的合并过程详解

    2023-11-29 02:50:35
  • asp之家 软件编程 m.aspxhome.com