常见的递归Java实现

形如

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

重要规则

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

主要解决问题

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

迷宫回溯问题

/*** 如果小球能到map[6][5]位置,则说明通路找到* 约定:在map[i][j] 为 0 表示该点没有走过 当为 1 表示墙; 2 表示通路可以走; 3表示该点已经走过,但是走不通* 在走迷宫时,需要确定一个策略(方法) 下->右->上->左,如果该点走不通,再回溯** @param map 表示地图* @param i   表示从地图的哪个位置开始出发(1,1)* @param j* @return*/
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,3return false;}}
}

八皇后递归问题

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔手
1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法(92)。

算法思路
  1. 第一个皇后先放第一行第一列
  2. 第二个皇后放在第二行第一列、然后判断是否0K,如果不0K,继续放在第二列、第三列、依次把所有列都放完,找到一个合适
  3. 继续第三个皇后,还是第一列、第二列.…直到第8个皇后也能放在一个不冲突的位置,算是找到了一个正确解
  4. 当得到一个正确解时,在栈回退到上一个栈时,就会开始回溯,即将第一个皇后,放到第一列的所有正确解,全部得到.
  5. 然后回头继续第一个皇后放第二列,后面继续循环执行1,2,3,4 的步骤

说明:理论上应该创建一个二维数组来表示棋盘,但是实际上可以通过算法用一个一维数组即可解决问题 arr[8] = {0,4,7,5,2,6,1,3} 表示 对应arr 下标 表示第几行,即第几个皇后,arr[i] = val,val表示第 i+1 个皇后,放在第 i+1 行的第 val+1 列

代码
package com.xiaolu.recursion;/*** @author 林小鹿* @version 1.0* 八皇后递归*/
public class Queue8 {// 定义一个max表示共有多少个皇后int max = 8;// 定义数组arry,保存皇后放置位置的结果,如 arr[] = {0,4,7,5,2,6,1,3}int[] array = new int[max];static int count = 0;static int judgeCount = 0;public static void main(String[] args) {Queue8 queue8 = new Queue8();queue8.check(0);System.out.printf("一共有%d种解法", count);System.out.printf("\n一共判断%d次", judgeCount);}// 放置第 n 个皇后private void check(int n) {if (n == max) { // n = 8 时,第八个皇后就已经放好了print();return;}// 依次放入皇后,并判断是否冲突// 注意:check 是每一次递归时,进入check中都有一个for循环,并且重复执行回溯的过程for (int i = 0; i < max; i++) {// 先把当前这个皇后 n 放到该行的第 1 列array[n] = i;// 判断是否冲突if (judge(n)) {// 不冲突// 接着放 n+1 个皇后,开始递归check(n + 1);}// 如果冲突,就继续执行 array[n] = i;即 将第 n 个皇后放置在本行的后一个位置}}/*** 判断检测皇后是否和前面已经摆放的皇后冲突** @param n 表示第 n 个皇后* @return*/private boolean judge(int n) {judgeCount++;for (int i = 0; i < n; i++) {// array[i] == array[n] 判断是否通一列// Math.abs(n-i) == Math.abs(array[n] - array[i]) 判断是否同一斜线// 没有必要判断是否在同一行,因为 n 每次都在递增if (array[i] == array[n] || Math.abs(n - i) == Math.abs(array[n] - array[i])) {return false;}}return true;}// 输入皇后摆放的位置private void print() {count++;for (int i = 0; i < array.length; i++) {System.out.print(array[i] + " ");}System.out.println();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/712518.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【教程】移动互联网时代的APP上架流程和要点

目录 摘要 引言 正文 一、应用商店注册 二、准备APP材料 三、打包上传App 摘要 本文将介绍移动应用程序上架的基本流程和要点&#xff0c;包括应用商店注册、APP材料准备、打包上传App、APP审核以及发布APP的详细步骤。此外&#xff0c;还会提到利用appuploder工具简化i…

Gradio学习(五)—————学习一下布局Column的使用

今天学一下布局 非常简单row就是行column就是列 如下就是两行两列 scale就是缩放比例&#xff0c;如下按钮类scale4&#xff0c;而文本框类scale1&#xff0c;按钮类显示宽度就是文本框类宽度的四倍 import gradio as gr with gr.Blocks() as demo:with gr.Row():with gr.Colu…

Spring Cloud 实战系列之 Zuul 微服务网关搭建及配置

一、创建SpringBoot项目 用mavan搭建也可以。&#xff08;重要的是后面pom里应该引入那些依赖&#xff0c;application.yml怎么配置&#xff09; 由于开始构建项目时选择了Eureka Server&#xff0c;所以pom.xml中不需要手动添加依赖了 首先在启动类SpringcloudApplicatio…

SpringBoot项目连接Redis报错:Connection refused: no further information

今天在使用SpringBoot连接Redis时发生了报错 明明Jedis能够连接成功为什么StringRedisTemplate就不行? 然后在网上找了一下说是关闭防火墙或者修改配置文件但是都不管用 最后发现是Redis在SpringBoot3之后yml的配置方式发生了改变 相较于之前多了一个前缀, 由于我刚开始没有…

项目风险管理的前提是对风险的认知

大家好&#xff0c;我是不会魔法的兔子&#xff0c; 一枚北京执业律师&#xff0c;创建[项目管理者的法小院儿]&#xff0c;持续从法律的角度分享项目管理中的风险问题及预防&#xff0c;让项目管理者能够提早发现与解决项目执行过程中的风险&#xff0c;同时欢迎大家一起交流…

论文解读--Mutual Interference Mitigation in PMCW Automotive Radar

PMCW汽车雷达的相互干扰抑制 摘要 针对相位调制连续波(PMCW)毫米波(mmWave)汽车雷达系统中存在的相互干扰问题进行了研究。对先进驾驶辅助系统(ADAS)的需求日益增长&#xff0c;导致配备在同一频段工作的毫米波雷达系统的车辆激增&#xff0c;导致相互干扰&#xff0c;可能会降…

WPF 滑动条样式

效果图&#xff1a; 浅色&#xff1a; 深色&#xff1a; 滑动条部分代码&#xff1a; <Style x:Key"RepeatButtonTransparent" TargetType"{x:Type RepeatButton}"><Setter Property"OverridesDefaultStyle" Value"true"/&g…

【Oracle】Oracle清理日志空间

&#xff08;一&#xff09;通过adrci清理日志空间 1.通过find命令查询大数据文件 find / -type f -size 100M 2.登录oracle数据库服务器用户 su - oracle 3.执行故障诊断命令 adrci 4.查询ADR目录 show home 5.切换到对应目录 set homepath diag/rdbms/orcl 6.执行日志清理命令…

枚举类、泛型、API

枚举类 枚举类可以实现单例设计模式。 枚举的常见应用场景&#xff1a;用来表示一组信息&#xff0c;然后作为参数进行传输。 泛型 API

Qt 中Qwidget相关属性

文章目录 1. QWidget 核心属性1.1 enabled1.2 geometry1.2.1 window frame 的影响 1.3 windowTitle1.4 windowIcon1.4.1 qrc的使用 1.5 windowOpacity1.6 cursor1.7 focusPolicy1.8 styleSheet 1. QWidget 核心属性 在 Qt 中, 使⽤ QWidget 类表⽰ “控件”. 像按钮, 视图, 输…

今年Android面试必问的这些技术面,2024Android常见面试题

都说程序员是在吃青春饭&#xff0c;这一点的确有一点对的成分&#xff0c;以前我不这么认为&#xff0c;但随着年龄的增长&#xff0c;事实告诉我的确是这样的&#xff0c;过了30以后&#xff0c;就会发现身体各方面指标下降&#xff0c;体力和身心上都多少有点跟不上了&#…

Node.js中的缓存策略和缓存技巧

在Node.js中&#xff0c;缓存策略和缓存技巧是提升应用性能和用户体验的关键因素。通过有效地利用缓存&#xff0c;我们可以显著减少系统资源的消耗&#xff0c;加快数据访问速度&#xff0c;从而提升整体的网站性能。本文将针对Node.js中的缓存策略和缓存技巧展开深入探讨&…

Newtonsoft.Json

目录 引言 1、简单使用 1.1、官方案例 1.2、JsonConvert 2、特性 2.1、默认模式[JsonObject(MemberSerialization.OptIn/OptOut)] 2.2、序列化为集合JsonArrayAttribute/JsonDictionaryAttribute 2.3、序列化该元素JsonProperty 2.4、忽略元素JsonIgnoreAttribute 2.5、…

iOS CVPixelBufferCreate 创建 CVPixelBufferRef 时屏幕拉伸或像素偏移(花屏)

先说结论&#xff1a; CVPixelBufferCreate 创建的 CVPixelBufferRef 可能由以下的原因导致的&#xff1a; 1.pixelFormatType 格式错误&#xff0c;换一下格式尝试 2.width和height 非 32 的整数倍 3.视频帧的宽高比非标准比例&#xff08;4:3,16:9,1:1&#xff09; 另外说明&…

今天面试招了个18K的人,从腾讯出来的果然都有两把刷子···

公司前段时间缺人&#xff0c;也面了不少测试&#xff0c;前面一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资在15-20k&#xff0c;面试的人很多&#xff0c;但平均水平很让人失望。看简历很多都是4年工作经验&#xff0c;但面试中&#xff0c;不…

docker save 命令 docker load 命令 快速复制容器

docker save 命令 docker load 命令 1、docker save 命令2、docker load 命令 1、docker save 命令 docker save 命令用于在系统上把正在使用的某个容器镜像 导出成容器镜像文件保存下载&#xff0c;以便在其他系统上导入这个容器镜像文件 以便快速在其他服务器上启动相同的容…

读书笔记:《思考 . 快与慢》- 1 系统1 系统2

《思考 . 快与慢》 [美] 丹尼尔 . 卡尼曼 著 胡晓姣 李爱民 何梦莹 译 这本书会改变你的思考方式 利用闲谈发现和分析别人犯的错误比分析自己的错误更容易&#xff0c;也更有意思 在人生最辉煌的时候&#xff0c;我们很难对自己的信念和需求产生怀疑&#xff0c;越是在最…

【Web】Java反序列化之CC2——commons-collections4的新链之一

目录 关于commons-collections4 一个重要的思维模型 触发Transform的关键类&#xff1a;TransformingComparator 反序列化的入口&#xff1a;PriorityQueue Exp 关于commons-collections4 commons-collections4 是 Apache Commons 组件库中的一个项目&#xff0c;它是对旧…

在Linux上定时执行脚本

在Linux上定时执行脚本通常可以使用 ​cron​任务来实现。​cron​是一个系统服务&#xff0c;用于在预定时间自动执行命令或脚本。下面是如何在Linux上设置定时执行脚本的步骤&#xff1a; 编写脚本&#xff1a;首先&#xff0c;你需要编写需要定时执行的脚本文件&#xff0c;…

找不到msvcp140.dll无法运行程序如何处理?分享5种解决方法

在计算机系统运行过程中&#xff0c;如果无法找到必要的动态链接库文件msvcp140.dll&#xff0c;可能会引发一系列的问题与故障。这个特定的dll文件是Microsoft Visual C Redistributable Package的一部分&#xff0c;对于许多基于此编译环境开发的应用程序至关重要。缺失msvcp…