【数据结构与算法】(JAVA版)递归,迷宫问题的解决

2023-05-16

递归

递归需要遵守的规则:

1)执行一个方法时,就在JVM栈中开辟一块内存,用于存放执行方法时所需的数据,比如方法局部变量,对象引用等,这块内存叫栈帧。JVM栈是JVM运行时内存的一个区域,JVM运行时内存还包括堆、方法区、程序计数器等区域
2)方法的局部变量是独立的,不会相互影响
3)如果方法中使用的是引用类型的变量(比如数组),就会共享该引用类型的数据
4)当一个方法执行完毕,或者遇到return, 就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。
5)递归必须向退出递归的条件逼近,否则就是无限递归出现StackOverflow
6)抛出StackOverflow的原因
    如果递归方法中没有终止条件,递归调用将不停的在栈中创建栈帧,如果超过虚拟机规定的栈最大容量则报StackOverflowError错误

1.递归调用必须要有终止条件(出口)

2.递归调用每次都要缩小范围,才能达到终止条件

例:求一个数据区间的累加和

public class Test {
	public static void main(String[] args) {
        int x = test(1,3);
		System.out.println(x);
	}
	public static int test(int start,int end) {
        //递归方法的出口
		if(start == end) {
			return end;
		}
		return start + test(start+1,end);
	}
}

图文说明:

在这里插入图片描述

迷宫问题

package dataStructure;
public class Labyrint {
	public static void main(String[] args) {
		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[] array:map) {
			for(int i:array) {
				System.out.print(i+"  ");
			}
			System.out.println();
		}
		setWay(map,1,1);
		System.out.println("探测之后的路线");
		for(int[] array:map) {
			for(int i:array) {
				System.out.print(i+"  ");
			}
			System.out.println();
		}
	}
	/**
	 * 使用递归回溯来找路
	 * map表示地图
	 * i,j表示初始位置所在行,列
	 * 如果小球能到map[6][5]位置,则说明通路找到
	 * 约定:当map[x][y] 为0表示该点没有走过,1表示墙,2表示通路可以走,3表示已经探测过但是走不通
	 * 策略:按照 下右上左 的顺序进行探测,如果走不通,再回溯
	 * 
	 * */
	public static boolean setWay(int[][] map,int i,int j) {
		if(map[6][5] == 2) {//已经找到通路
			return true;
		}else {
			if(map[i][j] == 0) {//当前点未走过
				map[i][j] = 2;
				if(setWay(map,i+1,j)) {//向下走
					return true;
				}else if(setWay(map,i,j+1)) {//向右走
					return true;
				}else if(setWay(map,i-1,j)) {//向上走
					return true;
				}else if(setWay(map,i,j-1)) {//向左走
					return true;
				}else {//说明都走不通
					map[i][j] = 3;
					return false;
				}
			}else {
				//如果map[i][j] != 0,则可能是1,2,3
				return false;
			}
		}
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【数据结构与算法】(JAVA版)递归,迷宫问题的解决 的相关文章

  • Java - 将无符号十六进制字符串解析为有符号长整型

    我有一堆十六进制字符串 其中之一是 d1bc4f7154ac9edb 这是 3333702275990511909 的十六进制值 如果执行 Long toHexString d1bc4f7154ac9edb 这与您得到的十六进制相同 现在
  • java 拖放

    我尝试熟悉java中的拖放 但我发现的所有教程都是 让我生气 我想要的只是从 JList 包含在名为 UserPanel 的自制 JPanel 中 拖动 PublicUserLabel 并将其放入从 JTabbedPanel 继承的自制类中
  • openFileOutput 在单例类中无法正常工作 - 想法/解决方法?

    作为一名 Android 开发新手 我遇到了一些奇怪的问题 我想创建一个类 它方法其他类 活动 任何可以用于以某种特殊方式处理文件的类 假设为了简单起见 我们将记录一些内容 如果我在活动中执行以下操作 例如在 OnClick 侦听器中 则一
  • ZeroDateTimeBehavior=convertToNull 在使用 hibernate 的 jdbc url 中不起作用

    通过 extern 属性文件 url 指定如下 jdbc mariadb xxxxx 3306 xxxxx zeroDateTimeBehavior convertToNull 连接工作正常并且能够查询数据库 通过休眠 我创建了一个映射到带
  • Android 信号 11 (SIGSEGV),代码 1 (SEGV_MAPERR) libwebviewchromium.so

    对于 android 4 4 我多次收到 Native crash at system lib libwebviewchromium so 错误 以下是设备包括 Xperia Z1 SO 01F 16 30 2 Galaxy Tab4 7
  • 使用 https 的 Web 服务身份验证给出错误

    我编写了一个简单的 Web 服务 并使用摘要和 HTTPS 身份验证来保护它 我已经使用 Java 中的 keytool 生成了我的证书 当我通过创建 war 文件在 Tomcat 中部署 Web 服务时 axis 的欢迎页面正确显示 但是
  • 如何在正则表达式中编写可选单词?

    我想编写一个识别以下模式的 java 正则表达式 abc def the ghi and abc def ghi 我试过这个 abc def the ghi 但是 它没有识别第二种模式 我哪里出错了 abc def the ghi 删除多余
  • 使用正则表达式验证电子邮件的最大长度

    我找到了用于电子邮件验证的正则表达式 a z0 9 a z0 9 a z0 9 a z0 9 a z 2 4 我希望电子邮件的最大长度为 20 个字符 因此我将其更改为 a z0 9 a z0 9 a z0 9 a z0 9 a z 2 4
  • 如何使用 aether 从 Java 找到最新版本的 Maven 工件?

    他们的文档非常薄弱 我无法弄清楚 我找到了部分答案here https stackoverflow com questions 27428068 how to retrieve the latest also snapshot versio
  • JFrame 在连续运行代码时冻结

    我在使用时遇到问题JFrame 它会冻结 连续运行代码 下面是我的代码 点击时btnRun 我调用了该函数MainLoop ActionListener btnRun Click new ActionListener Override pu
  • 扩展多个类

    我知道 Java 不支持多重继承 因为不允许扩展多个类 我只是想知道我的问题是否有解决方法 我有一个名为CustomAction需要扩展两个抽象类 BaseAction and QuoteBaseAction 我无法更改这些抽象类中的任何一
  • 为休息服务实施 JUnit 测试

    我必须为我的休息服务实现一些 JUnit 测试 例如 这是我的休息服务之一 Path dni fe public class HelloWorld POST Path home Consumes MediaType APPLICATION
  • 始终将双精度舍入

    我怎么总是能把一个double to an int 并且永远不要将其四舍五入 我知道Math round double 但我希望它始终向上舍入 所以如果是的话3 2 四舍五入为 4 您可以使用Math ceil method 请参阅Java
  • 为 REST API 生成 Swagger UI 文档

    我使用 Java 中的 JAX RS Jersey 开发了 REST API 我想为其转换 生成基于 Swagger 的 UI 文档 谁能以简单的方式告诉我如何做到这一点的精确 步骤 很抱歉 他们网站上给出的步骤对我来说有点模糊 有多种方法
  • 向Java类库添加函数

    我使用的 Java 类库在很多方面都不完整 有很多类我认为应该内置其他成员函数 但是 我不确定添加这些成员函数的最佳实践 让我们调用不足的基类A class A public A long arbitrary arguments publi
  • 如何使用 AffineTransform.quadrantRotate 旋转位图?

    我想旋转一个bitmap关于它的中心点 然后将其绘制成更大的图形上下文 位图是40x40 pixels 图形上下文是500x500 pixels 这就是我正在做的 BufferedImage bi new BufferedImage 500
  • log4j.properties 在 Wildfly 上无法正常工作

    我的类路径中有一个 log4j properties 文件 它位于 APP XX jar log4j properties 位置 我注意到在ear文件中我还可以在lib文件夹中找到log4j 1 2 17 jar 但无论我在 log4j p
  • 使用 Hibernate Envers 的复合表

    我有一个带有复合表的应用程序 其中包含一个额外的列 一切正常 直到我们添加 Hibernate Envers Audited org hibernate MappingException 无法读取 no pack response Resp
  • FetchType.LAZY 不适用于休眠中的 @ManyToOne 映射

    简而言之 我的 Child 类与 Parent 类之间存在多对一的关系 我想加载所有的孩子 而不必加载他们的父母详细信息 我的孩子班级是 Entity public class Child implements Serializable I
  • Graphics2D setfont() 严重减慢了 java 应用程序的启动速度

    我正在用java制作一个游戏 它每秒刷新60次 每次执行循环时 我都会使用 g2d 来绘制图像和字符串 如果我这样做的话一切都会很好g2d setFont new Font Arial Font PLAIN 8 和抽绳 这将是正常的 但如果

随机推荐

  • Qt5.14.2 编程应用

    Qt5 14 2 编程应用 什么是Qt Qt 是一个跨平台的 C 43 43 图形用户界面库 xff0c 由挪威 TrollTech 公司于 1995 年底出品 xff0c 并于 2008年6月17日被NOKIA公司收购 xff0c 以增强
  • L298N电机驱动的使用

    L298N电机驱动的使用 前言一 介绍L298N模块简介接口介绍 二 使用步骤硬件连接软件部分1 声明部分2 代码部分 总结 前言 博主为某大学电气专业大学生 xff0c 以学习为目的写下该文 xff0c 内容主要为以51单片机为例简单介绍
  • Authorization头的作用

    Authorization头的主要用作http协议的认证 Authorization的作用是当客户端访问受口令保护时 xff0c 服务器端会发送401状态码和WWW Authenticate响应头 xff0c 要求客户机使用Authoriz
  • vscode中常用的快捷键

    分享一些本人在学习前端过程中用到的一些快捷键 xff0c 需要强调的是 xff0c 这些快捷键适用的软件是VScode 因为自己初学前端用的是这个软件 其中有一些在idea中也是适用的 xff0c 已经在括号内标注 1 alt 43 W 将
  • PID算法原理及基本实现

    自动控制中 xff0c PID及其衍生出来的算法是应用最广的算法之一 各个做自动控制的厂家基本都有会实现这一经典算法 我们在做项目的过程中 xff0c 也时常会遇到类似的需求 xff0c 所以就想实现这一算法以适用于更多的应用场景 1 PI
  • Spring Boot基础学习之(六):前后端交互实现用户登录界面

    本次项目所有能够使用的静态资源可以免费进行下载 静态资源 本篇博客写的内容 xff0c 是一个系列 xff0c 内容都是关于spring boot架构的学习 xff0c 实现前后端交互 xff0c 极大的解放双手spring boot学习系
  • USMART调试组件

    什么是USMART USMART是正点原子团队为其STM32开发平台开发的一种类似linux的shell的调试工具 具体工作过程是通过串口发送命令给单片机 然后单片机收到命令之后调用单片机里面对应的相关函数 并执行 同时支持返回结果 USM
  • 内部温度传感器

    STM32有一个内部的温度传感器 可以用来测量CPU及周围的温度 TA 该温度传感器在内部和ADCX IN16输入通道相连接 此通道把传感器输出的电压转换成数字值 温度传感器模拟输入推荐采样时间是17 1us STM32的内部温度传感器支持
  • 光敏传感器

    光敏传感器是利用光敏元件将光信号转换为电信号的传感器 它的敏感波长在可见光波长附近 包括红外线波长和紫外线波长 光传感器不只局限于对光的探测 它还可以作为探测元件组成其他传感器 对许多非电量进行检测 只要将这些非电量转换为光信号的变化即可
  • 网络基础应用层--HTTP协议

    网络基础应用层 HTTP协议 一 应用层协议 xff08 一 xff09 应用层协议概念 xff08 二 xff09 自定义协议概念 xff08 三 xff09 数据格式如何定义最优 xff08 四 xff09 结构体的二进制序列化 二 H
  • SPI接口原理与配置

    SPI接口简介 SPI是英语Serial Peripheral interface的缩写 顾名思义就是串行外围设备接口 是Motorola首先在其MC68HCXX系列处理器上定义的 SPI是一种高速的 全双工 同步的通信总线 并且在芯片的管
  • DHT11温湿度传感器实验

    DHT11 是一款湿温度一体化的数字传感器 该传感器包括一个电阻式测湿元件和一个 NTC 测温元件 xff0c 并与一个高性能 8 位单片机相连接 通过单片机等微处理器简单的电路连接就能够 实时的采集本地湿度和温度 DHT11 与单片机之间
  • 串口通讯的配置

    串口以及中断的配置 xff1a if EN USART1 RX 如果使能了接收 串口1中断服务程序 注意 读取USARTx gt SR能避免莫名其妙的错误 u8 USART RX BUF USART REC LEN 接收缓冲 最大USART
  • 485代码分析

    rs485 h ifndef RS485 H define RS485 H include 34 sys h 34 extern u8 RS485 RX BUF 64 接收缓冲 最大64个字节 extern u8 RS485 RX CNT
  • 【数据结构】手把手教你利用栈实现二进制转换成十进制(C语言)

    1 第一步创建一个栈 span class token macro property span class token directive keyword include span span class token string lt st
  • 【数据结构】数组的物理地址寻址

    一 xff1a 数组的类型定义 数组是有类型相同的数据元素的有序集合 二 xff1a 数组的顺序储存 数组为什么不采用链式存储结构 xff1f 1 xff1a 数据的结构固定 xff08 维数和维界不变 xff09 xff0c 也就是说一旦
  • 【数据结构与算法】数和二叉树基础题目练习详解

    1 xff0c 在一棵树中 xff0c 如果结点A有3个兄弟 xff0c 而且B是A的双亲 xff0c 则B的度是 xff08 xff09 解 xff1a B的度是4 2 xff0c 对于一棵具有n个结点的树 xff0c 该树中所有结点的度
  • 【数据结构】图的基础练习题目,及题解

    1 xff0c 有n个结点的无向图最多有 xff08 xff09 条边 xff0c 有向图最多有 xff08 xff09 条边 xff08 弧 xff09 解 xff1a n n 1 2 n n 1 无向图中两点之间连成一条直线 xff1b
  • 【数据结构与算法】(JAVA版)队列,使用普通数组模拟队列(应用场景:银行预约叫号系统),数组模拟环形队列

    内容非常详细 xff0c 不懂请耐性看完 xff0c 关键步骤都有注释 队列Queue 普通数组模拟队列 队列应用场景 xff1a 银行预约叫号系统队列是一个有序列表 xff0c 可以用数组或是链表来实现 本代码使用数组模拟队列基本实现思想
  • 【数据结构与算法】(JAVA版)递归,迷宫问题的解决

    递归 递归需要遵守的规则 xff1a span class token number 1 span span class token punctuation span 执行一个方法时 xff0c 就在JVM栈中开辟一块内存 xff0c 用于