数据结构之递归的应用场景迷宫问题

2023-11-19

递归是什么

简单的说:递归就是方法自己调用自己,每次调用的时传入不同的变量。递归有助于开发解决复杂的问题,同时可以使代码变的简洁。

递归调用机制

直接上代码,用案例说明,我觉得在学校老师好像讲过很多遍了,但是过一端时间自己又写不出来。

打印问题

看一下输出结果吧


/**
 * 输出结果
 */
public class test1 {

    public static void main(String[] args) {
        fun(5);
    }

    public static void fun(int n){
        if (n > 2){
            fun(n - 1);
        }
        System.out.println("n = " + n);
    }
}

在这里插入图片描述

阶乘



/**
 * 阶乘问题
 */
public class factorialTest {

    public static void main(String[] args) {
        int factorial = factorial(5);
        System.out.println("factorial = " + factorial);
    }

    public static int factorial(int n){
        if (n == 1){
            return 1;
        }else {
            return factorial(n - 1) * n;
        }
    }

}

输出结果
在这里插入图片描述

递归能解决的问题

  • 各种数学问题如:8皇后问题﹐汉诺塔,阶乘问题,迷宫问题,球和篮子的问题(google编程大赛)
  • 各种算法中也会使用到递归,比如快排,归并排序,二分查找,分治算法等.
  • 将用栈解决的问题。递归代码比较简洁。

递归需要遵守的重要规则

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

迷宫问题

迷宫问题是栈这一块很经典的问题。
在这里插入图片描述

迷宫大致可分为三种,简单迷宫、多通路迷宫:通路间不带环、多通路迷宫:通路间带环,其中带环多通路迷宫是最复杂的,解决它,要把栈与递归结合起来,下来我们来一个一个分析吧,先从简单迷宫开始。

给定一个迷宫Maze,并给定迷宫的路口和出口,用递归的方式搜索一条从入口到出口的可行路径(其中红色为围墙,蓝色为可行路),若存在这条路径,则打印出路径,若不存在路径,则输出信息,表示没有路径。

package recursion;

import java.awt.geom.AffineTransform;

/**
 * 递归求解迷宫
 */
public class Maze {

    public static void main(String[] args) {
        //创建二维数组,模拟迷宫。
        int[][] maze = new int[8][7];
        //使用1表示墙。上下为墙,设置为1.
        for (int i = 0; i < 7; i++) {
            maze[0][i] = 1;
            maze[7][i] = 1;
        }
        //左右为1,设置1
        for (int i = 0; i < 8; i++) {
            maze[i][0] = 1;
            maze[i][6] = 1;
        }

        //设置障碍物
        maze[3][1] = 1;
        maze[3][2] = 1;


        System.out.println("=============init maze ==============");
        //输出迷宫
        for (int[] data : maze) {
            for (int item : data){
                System.out.printf("%4d",item);
            }
            System.out.println();
        }
        System.out.println("=============init maze success========");

        //使用递归找出结果,[1][1]开始
        setWay(maze,1,1);
        System.out.println("=============success========");
        for (int[] data : maze) {
            for (int item : data){
                System.out.printf("%4d",item);
            }
            System.out.println();
        }
    }

    /**
     * 使用递归找出结果
     * 从[i][j] 出发
     * 若球儿能走到maze[6][5]的位置,则找打通路
     * 约定:
     *      [i][j]=0 该坐标点没走过,1表示墙,2为通路,3为已经走过,死路。
     *      确定一个策略,寻路方向 下,右,上,左的顺序。走不通则回溯
     * @param maze 二维数组地图
     * @param i  开始坐标
     * @param j
     * @return
     */
    public static boolean setWay(int[][] maze,int i,int j){
        if (maze[6][5] == 2){ //找到通路
            return true;
        }else {
            if (maze[i][j] == 0){ //没有走过
                //安装策略走,下,右,上,左
                maze[i][j] = 2;//假设改点为通路
                if (setWay(maze,i + 1,j)){ //下方向
                    return true;
                }else if (setWay(maze,i,j + 1)){//右方向
                    return true;
                }else if (setWay(maze,i - 1,j)){ //上方向
                    return true;
                }else if (setWay(maze,i,j - 1)){//左方向
                    return true;
                }else { //死路
                    maze[i][j] = 3;
                    return false;
                }
            }else { //不等于0 ,可能是1,2,3,因为都不能走,所以返回false
                return false;
            }
        }
    }
}

输出结果
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构之递归的应用场景迷宫问题 的相关文章

  • Android NumberPicker 带字符串

    I have customised the NumberPicker to show text The output is this 当我按 确定 时 我想将 e x 鼠标添加到我的列表 文章 中 我得到的是索引值 int 它由 array
  • 从 OMElement 对象获取 InputStream/io.Reader

    我有一个OMElement对象 从中我想得到一个InputStream或读者对象 我想要的是流式传输xml来自OMElement我有 没有加载到内存中 我只能得到XMLStreamReader对此表示反对 但我找不到办法得到InputStr
  • JavaEE 8 教程,在 hello1 项目上部署失败

    我正在尝试学习 Java EE 8 我遵循了官方指南https javaee github io tutorial https javaee github io tutorial 但我有这个问题 cargo maven2 plugin 1
  • V8 如何管理它的堆?

    我知道V8的垃圾收集在工作时 会从GC的root开始追踪 这样无法到达的对象就会被标记然后被清除 我的问题是GC是如何遍历那些对象的 必须有一个数据结构来存储所有可达或不可达的对象 位图 链接表 顺便说一句 JVM 也做同样的事情吗 艾伦秀
  • JPanel透明背景和显示元素[重复]

    这个问题在这里已经有答案了 我插入一个背景图e 变成 aJPanel但一些界面元素消失了 以下 Java Swing 元素不会出现 标签标题 标签 usuario 标签 密码 按钮加速器 你能否使图像透明或元素不透明 setOpaque f
  • .java 和 .scala 类之间是否可能存在循环依赖?

    假设我在 java 文件中定义了类 A 在 scala 文件中定义了类 B A 类使用 B 类 B 类使用 A 类 如果我使用 java 编译器 则会出现编译错误 因为 B 类尚未编译 如果我使用scala编译器A类将找不到 有没有可以同时
  • 使用 jdbc 程序连接到 Open Office odb 文件

    我编写了以下代码来连接到 OpenOffice db String db C Documents and Settings hkonakanchi Desktop Test odb Class forName org hsqldb jdbc
  • java“void”和“非void”构造函数

    我用 java 编写了这个简单的类 只是为了测试它的一些功能 public class class1 public static Integer value 0 public class1 da public int da class1 v
  • 如何解决错误:java.lang.ClassNotFoundException:io.netty.util.concurrent.GenericFutureListener?

    昨天我第一次尝试用 Java 制作 Prometheus 客户端 从 Python 开始 最后是 GoLang 是否找到示例 import io prometheus client Counter import io prometheus
  • 业务代表与服务定位器

    Business Delegate 和 Service Locator 之间有什么区别 两者都负责封装查找和创建机制 如果 Business Delegate 使用 Service Locator 来隐藏查找和创建机制 那么 Busines
  • 如何模拟一个方面

    我目前正在使用aspectj 开发一些监控工具 因为这个工具应该是技术独立的 尽可能 所以我没有使用 Spring 进行注入 但我希望我的方面能够经过单元测试 方面示例 Aspect public class ClassLoadAspect
  • LibGdx 如何使用 OrthographicCamera 滚动?

    我已经找了 10 个小时 字面意思 我已经完成了 我需要问一下 事情是我正在学习如何使用 LibGdx 来编写 Java 游戏 我正在做一个水平太空飞船游戏 所以 我最糟糕的问题是我不知道如何滚动 我认为绘制会更好地解释 我想绘制一个巨大的
  • java JFileChooser 文件大小过滤器

    我知道我可以按文件类型进行过滤 但是可以按文件大小进行过滤吗 例如 JFileChooser 仅显示 3 MB 以内的图片 简短的回答应该是 你尝试过什么 长答案是肯定的 JFileChooser fc new JFileChooser f
  • 如何在将数据发送到 Firebase 数据库之前对其进行加密?

    我正在使用 Firebase 实时数据库制作聊天应用程序 我知道 Firebase 非常安全 只要您的规则正确 但我自己可以阅读使用我的应用程序的人的所有聊天记录 我想阻止这种情况 为此我需要一种解密和加密方法 我尝试使用凯撒解密 但失败了
  • 字节码和位码有什么区别[重复]

    这个问题在这里已经有答案了 可能的重复 LLVM 和 java 字节码有什么区别 https stackoverflow com questions 454720 what are the differences between llvm
  • @TestPropertySource 不适用于 Spring 1.2.6 中使用 AnnotationConfigContextLoader 的 JUnit 测试

    似乎我在 Spring 4 1 17 中使用 Spring Boot 1 2 6 RELEASE 所做的任何事情都不起作用 我只想访问应用程序属性并在必要时通过测试覆盖它们 无需使用 hack 手动注入 PropertySource 这不行
  • 如何计算文件中单词的长度?爪哇

    我正在尝试编写一个代码来计算文件中特定长度的单词数 例如 How are you 会打印 Proportion of 3 letter words 100 3 words 我想计算长度为 1 2 3 4 5 6 7 8 9 10 11 12
  • Scala repl 抛出错误

    当我打字时scala在终端上启动 repl 它会抛出此错误 scala gt init error error while loading AnnotatedElement class file usr lib jvm java 8 ora
  • 将隐藏(生物识别)数据附加到 pdf 上的数字签名

    我想知道是否可以使用 iText 我用于签名 或 Java 中的其他工具在 pdf 上添加生物识别数据 我会更好地解释一下 在手写板上签名时 我会收集签名信息 例如笔压 签名速度等 我想将这些信息 java中的变量 与pdf上的签名一起存储
  • 如何使用 Spring AOP 建议静态方法?

    在执行类的静态方法之前和之后需要完成一些日志记录 我尝试使用 Spring AOP 来实现这一点 但它不起作用 而对于正常方法来说它起作用 请帮助我理解如何实现这一点 如果可以使用注释来完成 那就太好了 也许您应该在使用 Spring AO

随机推荐