码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • golang数据结构与算法——递归、迷宫回溯和二叉树的遍历


    文章目录

    • 一 递归
      • 1.1 递归的概念
      • 1.2 快速入门
      • 1.3 应用场景
      • 1.4 递归需要遵守的重要原则
    • 二 迷宫回溯问题
    • 三 二叉树的4种遍历方式
      • 3.1 二叉树介绍
      • 3.2 二叉树的遍历方式
      • 3.3 二叉树模型
        • 3.3.1 基础结构
        • 3.3.2 二叉树模型代码
      • 3.4 前序递归遍历
      • 3.5 中序递归遍历
      • 3.6 后序递归遍历
      • 3.7 层序递归遍历
      • 3.8 完整代码


    一 递归

    1.1 递归的概念

    简单的说: 递归就是函数/方法自己调用自己,每次调用时传入不同的变量.第归有助于编程者解决复杂的问题,同时可以让代码变得简洁。

    使用递归函数最重要的三点:

    • 递归就是自己调用自己。
    • 必须先定义函数的退出条件,没有退出条件,递归将成为死循环。
    • go语言递归函数很可能会产生一大堆的goroutine,也很可能会出现栈空间内存溢出问题。

    1.2 快速入门

    package main
    
    import "fmt"
    
    func test(n int) {
       
    	if n > 2 {
       
    		n--
    		test(n)
    	} else {
       
    		fmt.Println("n=", n)
    	}
    }
    
    func main() {
       
    	n := 4
    	test(n)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    运行结果:

    [Running] go run "e:\golang开发学习\go_pro\test.go"
    n= 2
    
    [Done] exited with code=0 in 3.936 seconds
    
    • 1
    • 2
    • 3
    • 4

    示意图:

    在这里插入图片描述

    1.3 应用场景

    • 各种数学问题如: 8 皇后问题 , 汉诺塔, 阶乘问题, 迷宫问题, 球和篮子的问题(google 编程大
      赛)
    • 将用栈解决的问题–>第归代码比较简洁

    1.4 递归需要遵守的重要原则

    1. 执行一个函数时,就创建一个新的受保护的独立空间(新函数栈)
    2. 函数的局部变量是独立的,不会相互影响, 如果希望各个函数栈使用同一个数据,使用引用传递
    3. 递归必须向退出递归的条件逼近【程序员自己必须分析】,否则就是无限递归,死循环了
    4. 当一个函数执行完毕,或者遇到 return,就会返回,遵守谁调用,就将结果返回给谁,同时当函数执行完毕或者返回时,该函数本身也会被系统销毁

    二 迷宫回溯问题

    问题描述:

    ​ 有一个迷宫地图,其中地图中有一些不过达的位置(墙壁、障碍)。从一个起点开始,一步一步走到终点,如何找到一条到达的道路呢?

    在这里插入图片描述

    思路分析:

    ​ 利用二位数组来模拟迷宫地图,0表示没有走过的点,1表示墙壁,2表示走通的点,3表示走不通的点,按照自定义的寻路策略,遍历寻找路径,如果是死路则标示该路径走不通,回到起点,再重新找一条新路,以此类推,直到走通为止。这种方法又称作为回溯法(递归)。

    代码实现:

    package main
    
    import "fmt"
    
    // SetWay 寻找出路 i,j表示地图的坐标起点
    func SetWay(myMap *[8][8]int, i, j int) bool {
       
    
    	// 设置终点
    	if myMap[6][6] == 2 {
       
    		return true
    	}
    
    	if myMap[i][j] == 0 {
       
    		// 假设可以走通
    		myMap[i][j] = 2
    		// 寻路策略:下右上左
    		if SetWay(myMap, i+1, j) {
        // 下
    			return true
    		} else if SetWay(myMap, i, j+1) {
        // 右
    			return true
    		} else if SetWay(myMap, i-1, j) {
        // 上
    			return true
    		} else if SetWay(myMap, i, j-1) {
        // 左
    			return true
    		} else {
        // 死路
    			myMap[i][j] = 3
    			return false
    		}
    	}
    
    	return false
    }
    
    // ShowMap 输出地图
    func ShowMap(myMap [8][8]int) {
       
    	for i := 0; i < 8; i
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
  • 相关阅读:
    Air001 TIM16通用定时器作PWM输出和延时使用配置方法
    机器学习基本知识(1)
    Java If Else 语句
    导出微信通讯录
    攻克海外市场!企业客户培育,销售额倍增
    ArduPilot开源飞控之AP_InertialNav
    【MySQL】聚合查询与分组查询
    如何寻找计算机领域的英文文献?
    2.1、如何在FlinkSQL中读取&写出到Kafka
    使用定时器获取转速信息(PWM频率)
  • 原文地址:https://blog.csdn.net/qq_39280718/article/details/126409035
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号