递归

递归的概念

简单的说,递归就是函数/方法自己调用自己

每次调用传入不同的变量。

递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。

递归需要遵守的重要原则

1)执行一个函数时,就创建一个新的受保护的独立空间(新函数栈)。

2)函数的局部变量是独立的,不会相互影响。

3)递归必须向退出递归的条件逼近,否则就是无限递归。

4)当一个函数执行完毕,或者遇到 return ,就会返回,遵守谁调用,就将结果返回给谁。

同时当函数执行完毕或者返回时,该函数本身也会被系统销毁。

走迷宫算法

初始化迷宫

我们可以用二维数组来表示迷宫:

先创建一个二维数组,模拟一个迷宫地图。

1 代表墙。

0 代表没有走过的点。

2 元素的值为2,表示可以走通的路。

3 表示曾经走过,但是是一条死路。

==========迷宫地图==========1 1 1 1 1 1 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 1 1 0 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 1 1 1 1 1 1

迷宫地图如图所示:

思路分析

使用递归思想来走迷宫。

设置一开始走迷宫的策略为:下、右、上、左。

由起点开始(1,1),递归地分别查看 下、右、上、左 格子的状态。

直到终点(5,6)被标识为 2 ,说明成功走到了终点,这个迷宫从设置的起点出发,可以走到迷宫的终点。

完整代码

/*数据结构递归走迷宫算法
*/
package mainimport "fmt"// 找迷宫的出路的算法
// mazeMap 迷宫的地图
// i,j 出发点的坐标
func GetMazeWay(mazeMap *[8][7]int, i int, j int) bool {if mazeMap[6][5] == 2 {return true} else {// 说明要继续找// 说明可以继续探索,起始点不在墙上if mazeMap[i][j] == 0 {// 假设这个点是通路// 但是能不能通还需要具体探测// 探测的策略 (下、右、上、左)mazeMap[i][j] = 2if GetMazeWay(mazeMap, i+1, j) { // 向下走return true} else if GetMazeWay(mazeMap, i, j+1) { // 向右走return true} else if GetMazeWay(mazeMap, i-1, j) { // 向上走return true} else if GetMazeWay(mazeMap, i, j-1) { // 向左走return true} else { // 死路mazeMap[i][j] = 3return false}} else { // 说明这个点不能探测,是一堵墙return false}}}func main() {// 先创建一个二维数组,模拟一个迷宫地图// 1 代表墙// 0 代表没有走过的点// 2 元素的值为2,表示可以走通的路// 3 表示曾经走过,但是是一条死路var mazeMap [8][7]int// 把最外的一圈设置为墙for i := 0; i < len(mazeMap); i++ {for j := 0; j < len(mazeMap[i]); j++ {if i == 0 || i == (len(mazeMap)-1) {mazeMap[i][j] = 1}if j == 0 || j == (len(mazeMap[i])-1) {mazeMap[i][j] = 1}}}mazeMap[3][1] = 1mazeMap[3][2] = 1// 输出地图fmt.Println("==========迷宫地图==========\n")for i := 0; i < len(mazeMap); i++ {for j := 0; j < len(mazeMap[i]); j++ {fmt.Print(mazeMap[i][j], " ")}fmt.Println()}GetMazeWay(&mazeMap, 1, 1)fmt.Println("\n==========迷宫地图&走迷宫的路径==========\n")for i := 0; i < len(mazeMap); i++ {for j := 0; j < len(mazeMap[i]); j++ {fmt.Print(mazeMap[i][j], " ")}fmt.Println()}}

执行结果

==========迷宫地图==========1 1 1 1 1 1 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 1 1 0 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 1 1 1 1 1 1==========迷宫地图&走迷宫的路径==========1 1 1 1 1 1 1
1 2 0 0 0 0 1
1 2 2 2 0 0 1
1 1 1 2 0 0 1
1 0 0 2 0 0 1
1 0 0 2 0 0 1
1 0 0 2 2 2 1
1 1 1 1 1 1 1

走迷宫算法1(递归 非最短路径)相关推荐

  1. DFS走迷宫问题(非最短路径)

    上面之所以要强调非最短路径,是因为在下一篇我要用BFS来求解最短路径的问题.这里只是讲如何走出迷宫. #include<cstdio> #define M 10 #define N 10 ...

  2. 一文彻底搞定二叉树的前序、中序、后序遍历(图解递归非递归)

    前言 大家好,我是bigsai,在数据结构与算法中,二叉树无论是考研.笔试都是非常高频的考点内容,在二叉树中,二叉树的遍历又是非常重要的知识点,今天给大家讲讲二叉树的层序遍历. 这部分很多人可能会但是 ...

  3. 图的遍历(递归+非递归)

    图遍历一共有四种,邻接矩阵的BFS与DFS,邻接表的BFS与DFS 还有BFS(BFS没有递归!)与DFS递归与非递归: 目录 DFS 手工 邻接矩阵 递归 非递归 邻接表 递归 非递归 BFS 手工 ...

  4. java 建树源码_Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】...

    import java.util.ArrayDeque; import java.util.Queue; import java.util.Stack; //二叉树的建树,前中后 递归非递归遍历 层序 ...

  5. 快排递归非递归python_Python递归神经网络终极指南

    快排递归非递归python Recurrent neural networks are deep learning models that are typically used to solve ti ...

  6. c语言折半查找递归程序,C语言数据结构中二分查找递归非递归实现并分析

    C语言数据结构中二分查找递归非递归实现并分析 前言: 二分查找在有序数列的查找过程中算法复杂度低,并且效率很高.因此较为受我们追捧.其实二分查找算法,是一个很经典的算法.但是呢,又容易写错.因为总是考 ...

  7. 数据结构(七)图的遍历(递归非递归方法)

    图的遍历(递归非递归方法) #include<iostream> #include<stdio.h> #include<stack> #include<que ...

  8. 数据结构(六)二叉树的遍历(递归非递归方法)

    数据结构(六)二叉树的遍历(递归非递归方法) 一.递归方法 1.先序遍历 void PreOrder(BiTree T) {visit(T);PreOrder(T->LChild)PreOrde ...

  9. 二叉树的深度(前序 中序 后序 递归非递归搜素)、广度、搜索 C++

    a b c 使用 1 2 3 表示 /* 描述:二叉树的深度(前序 中序 后序 递归非递归搜素).广度.搜索 作者:jz 日期:20140819 */ #include<stdio.h> ...

  10. 二叉树——中序遍历(递归/非递归)

    中序遍历,即遍历顺序为:左节点.根节点.右节点. 二叉树节点: public class Node {public Node left;public Node right;public int val ...

最新文章

  1. Opencv各版本Release下载
  2. 大型网站演化发展历程之三
  3. Python整型数与字符串相互转换
  4. 直播 | 旷视研究院最新理论成果:批归一化和权重衰减的球面优化机制
  5. 10个 DIV+CSS 需要注意的问题
  6. 5G加持!刘作虎确认一加7 Pro:屏幕成本是普通旗舰2倍
  7. uml类图用什么软件画_为什么需要UML类图建模?
  8. 常用图表的用法-分布类
  9. CTP: 找ActionDay 和TradingDay说点事
  10. 计算机aero背景黑,win7系统如何打开和关闭Aero特效
  11. 使用NVivo完善定性编码的艺术
  12. 希腊字母表(含读音)
  13. win10桌面显示计算机及网上邻居,Win10网上邻居在哪? Win10桌面显示网上邻居网络图方法...
  14. 支付宝小程序获取手机号和授权信息遇坑锦集
  15. 毕业三周年,又一个离别季
  16. Ant Design Vue 动态路由
  17. 软件开发过程与项目管理(12.软件项目合同计划)
  18. SAP中状态参数文件最高状态和最低状态的理解
  19. Dotween简单安装设置
  20. 零 XML 多表联查

热门文章

  1. IEC60068-2-5太阳辐射模拟试验测试
  2. JS 时间格式化 时间戳 日期
  3. matebook14支持触摸屏吗_新款华为MateBook 14 2020款评测——触控屏来!
  4. USB引脚定义以及导线的颜色定义
  5. 如何学习plc编程?(核心秘诀分享)
  6. 台达PLC变频器通讯程序
  7. 2000款学校教师课件培训PPT模板免费下载网址
  8. Android APK下载安装(自动更新)
  9. c语言如何让图片置顶,UIView完全置顶的方法
  10. 单节锂电池充电管理芯片,IC电路图