码农行者 码农行者
首页
  • Python

    • 语言特性
    • Django相关
    • Tornado
    • Celery
  • Golang

    • golang学习笔记
    • 对比python学习go
    • 模块学习
  • JavaScript

    • Javascript
  • 数据结构预算法笔记
  • ATS
  • Mongodb
  • Git
云原生
运维
垃圾佬的快乐
  • 数据库
  • 机器学习
  • 杂谈
  • 面试
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

DeanWu

软件工程师
首页
  • Python

    • 语言特性
    • Django相关
    • Tornado
    • Celery
  • Golang

    • golang学习笔记
    • 对比python学习go
    • 模块学习
  • JavaScript

    • Javascript
  • 数据结构预算法笔记
  • ATS
  • Mongodb
  • Git
云原生
运维
垃圾佬的快乐
  • 数据库
  • 机器学习
  • 杂谈
  • 面试
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 数据结构与算法 - 算法 - 递归

    • 可用递归解决的问题的三个条件
      • 如何编写递归代码
        • 递归使用时需要注意的问题
          • 堆栈溢出
          • 递归警惕重复计算
        • 递归改写成非递归
        • 计算机基础
        • 数据结构与算法笔记
        DeanWu
        2019-12-26
        目录

        数据结构与算法 - 算法 - 递归

        《数据结构与算法-王争》学习笔记,记录备查

        # 可用递归解决的问题的三个条件

        • 一个问题的解可以分解为几个子问题的解

        • 这个问题和子问题之后的子问题,除了数据规模不同,求解思路完全一致。

        • 存在递归终止条件

        # 如何编写递归代码

        关键:写出递归公式,找到终止条件

        写递归代码的关键就是找到如何将大问题分解为小问题的规律,并且基于此写出递推公式,然后再推敲终止条件,最后将递推公式和终止条件翻译成代码。

        # 递归使用时需要注意的问题

        # 堆栈溢出

        我们知道函数的临时变量时使用栈来保存的,当函数递归的深度大于栈的大小时,就发生溢出。

        规定递归的深度可以部分解决堆栈的溢出的问题。因为最大允许的递归深度跟当前线程剩余的栈空间大小有关,事先无法计算,不合适使用该方法。

        # 递归警惕重复计算

        递归使用时,还会出现重复计算的问题。

        可通过一个数据结构(如散列表)暂存以计算的值,等递归时先查询是否已经计算过,如以计算直接返回即可。

        递归还有些其他问题,如空间复杂度高、过多的函数调用会耗时较多等。

        # 递归改写成非递归

        递归代码归根结底是利用了栈的出栈、入栈,如果我们自己模拟栈的操作,理论上来说任何递归都可以改写成非递归方式。

        #数据结构与算法#递归
        上次更新: 2023/03/19, 15:09:33
        最近更新
        01
        chromebox/chromebook 刷bios步骤
        03-01
        02
        redis 集群介绍
        11-28
        03
        go语法题二
        10-09
        更多文章>
        Theme by Vdoing | Copyright © 2015-2024 DeanWu | 遵循CC 4.0 BY-SA版权协议
        • 跟随系统
        • 浅色模式
        • 深色模式
        • 阅读模式