【数据结构与算法 8】递归之迷宫问题
一、简介
递归就是方法自己调用自己,每次调用时传入不同的参数,递归有利于编程者解决复杂的问题,同时可以让代码变得简洁。
二、用一个例子引出递归概念
public static void test(int n){if(n>2){test(n-1);}System.out.println("n="+n);
}
打眼一看,很low,很简单,4,3,2无疑。
为了验证我的聪明才智,输出一把吧
三、递归调用规则(很重要)
1、执行一个方法时,就创建一个新的受保护的独立空间(栈空间);
2、方法的局部变量是独立的,不会相互影响,比如变量n;
3、如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据;
4、递归必须向退出递归的条件逼近,否则就是无限递归,StackOverflowError;
5、当一个方法执行完毕,或遇到return,就会返回,遵守谁调用就将结果返回给谁,同时当方法执行完毕或return时,该方法也就执行完毕。
四、递归能解决什么样的问题
1、各种数学问题
比如八皇后问题、哈诺塔、阶乘问题、迷宫问题、球和篮子的问题(Google编程大赛)。
2、各种算法中也会使用递归
比如快排、归并排序、二分查找、分治算法。
3、栈解决的问题都可以用递归
代码更加简洁。
五、迷宫问题
1、代码实现
package dataStructure.recursion;public class Labyrinth {public static void main(String[] args) {//迷宫问题//0 表示该点没有走过 当为 1 表示墙 ; 2 表示通路可以走 ; 3 表示该点已经走过,但是走不通int[][] map = new int[8][7];for(int i=0;i<8;i++){for (int j = 0; j < 7; j++) {map[0][j] = 1;map[7][j] = 1;map[i][0] = 1;map[i][6] = 1;}}//设置挡板, 1 表示map[3][1] = 1;map[3][2] = 1;for (int i = 0; i < 8; i++) {for (int j = 0; j < 7; j++) {System.out.print(map[i][j]+" ");}System.out.println();}setWay(map,1,1);System.out.println("迷宫走过之后地图");for (int i = 0; i < 8; i++) {for (int j = 0; j < 7; j++) {System.out.print(map[i][j]+" ");}System.out.println();}}//使用递归回溯来给小球找路//说明//1. map 表示地图//2. i,j 表示从地图的哪个位置开始出发 (1,1)//3. 如果小球能到 map[6][5] 位置,则说明通路找到.//4. 约定: 当map[i][j] 为 0 表示该点没有走过 当为 1 表示墙 ; 2 表示通路可以走 ; 3 表示该点已经走过,但是走不通//5. 在走迷宫时,需要确定一个策略(方法) 下->右->上->左 , 如果该点走不通,再回溯private 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 {return false;}}}
}
2、控制台输出
注:1表示墙,2表示你走的路,0表示没走的路。
这个还是挺简单的!
每一篇博客都是一种经历,程序猿生涯的痕迹,知识改变命运,命运要由自己掌控,愿你游历半生,归来仍是少年。
欲速则不达,欲达则欲速!
【数据结构与算法 8】递归之迷宫问题相关推荐
- 数据结构和算法(十)递归-迷宫游戏
1. 数据结构和算法(十)递归-迷宫游戏 1.1 迷宫游戏 今天做一个简单的迷宫游戏,用二维数实现地图,让程序自动寻路的小游戏. 1.2 简单的迷宫 简单的迷宫 用二维数实现地图,找路策略:[右- ...
- 数据结构与算法之递归题目
数据结构与算法之递归题目 目录 求n!的结果 汉若塔问题 打印字符串的全部子序列,包括空字符串 打印一个字符串的全部排序 1. 求n!的结果 public static long getFactori ...
- 数据结构与算法之递归系列
本文来自一个不甘平凡的码农 写在前边 几个月之前就想写这样一篇文章分享给大家,由于自己有心而力不足,没有把真正的学到的东西沉淀下来,所以一直在不断的在自学. 然后又用了一个星期的时间去整理.分类,才有 ...
- 数据结构与算法解析 -- “递归”篇
2020-6-16 十步杀一人,千里不留行.事了拂衣去,深藏身与名. 李白 – <侠客行 > 一.概述 递归,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法.也就是说,递归算法 ...
- python数据结构与算法 20 递归和递归三定律
递归 本章目标 理解很多复杂问题,如果不用递归就很难解决,用递归也许非常简单 学会怎样进行递归编程 理解并应用递归三定律 理解递归也是一种迭代 建立一个问题的递归方法 理解递归在计算机系统内是如何进行 ...
- java 数据结构 迷宫_JAVA数据结构与算法之递归(一)~ 迷宫问题
递归 递归需要遵守的重要规则 1) 执行一个方法时,就创建一个新的受保护的独立空间(栈空间) 2) 方法的局部变量是独立的,不会相互影响, 比如 n 变量 3) 如果方法中使用的是引用类型变量(比如数 ...
- 数据结构与算法课程设计——C++迷宫游戏
问题描述 程序开始运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的右下方有一个粮仓.游戏的任务是使用键盘上的方向健操纵老鼠在规定的时间内走到粮仓处. 基本要求 (1) 老鼠形象可以辨认,可用键盘操纵 ...
- (数据结构与算法)递归及一些经典递归问题
文章目录 1. 递归的概念 2. 递归的调用机制 3. 递归需要遵守的重要规则 4. 递归 - 迷宫问题 5. 递归-八皇后问题 1. 递归的概念 递归就是方法自己调用自己,每次调用时传入不同的变量. ...
- 数据结构与算法学习--递归
今天简单了解一下递归,递归对我来说还是比较难理解的一种算法:关键因素是如何找到递推的公式.下面就简单的来了解一下满足递归的条件,及递归的弊端,递归的关键因素. 递归的弊端: 1.堆栈溢出问题 函数调用 ...
- 【数据结构与算法】递归树
1.树.二叉树 2.二叉查找树 3.平衡二叉树.红黑树 4.递归树 一.什么是递归树 如果我们把这个一层一层的分解过程画成图,它其实就是一棵树.我们给这棵树起一个名字,叫作递归树. 时间复杂度分析的递 ...
最新文章
- linux pytorch 快速安装
- 使用iphone功能来实现远程监控
- CocoaPods 错误解决 Attempt to read non existent folder
- Office 2010 与搜狗输入法兼容问题
- JS获取当前时间date()的用法
- java实现加密电话号码,有具体的加密流程注释
- 从C#到Objective-C,循序渐进学习苹果开发(1)--准备开发账号和开发环境
- 实现简单的字符串队列
- ie浏览器打开aspx文件乱码_html文件的中文乱码问题与在浏览器中的显示问题
- 游戏社交不足怎么办? 游戏发行中的社交化运营经验分享
- 2018只剩32天,动着心思想跳槽的你,还要YY到什么时候
- for in和for of的区别(转)
- jeecg框架 弹出框问题
- Win7删除GRUB For DOS启动项
- ppt制作弹跳的小球动画效果_PPT动画制作教程:小球弹跳动画
- 江苏省普通话水平测试计算机评分细则,江苏省普通话水平测试评分细则(试行).doc...
- 关于将数据写入文件的两个函数fwrite()与fprintf()的大不同 —————— 开开开山怪
- mybatis与spring整合详解
- JavaScript对象、基本类型和字面值之间的区别
- 【中间件技术】第二部分 CORBA规范与中间件(4) 编写对象接口