数据结构与算法笔记01——递归

数据结构与算法笔记01——递归

递归

  • 递:一个问题拆解为多个相同的子问题,子问题继续拆解至无法拆解
  • 归:从无法拆解的子问题出发回到最初的问题

满足三个条件就可以使用递归来解决

  1. 一个问题的解可以分解为几个子问题的解
  2. 问题与分解的子问题,除了数据规模不同,求解思路完全一致
  3. 存在递归终止条件

写递归代码的关键

  1. 找到如何将大问题分解为小问题的规律
  2. 基于第一点写出递推公式
  3. 推敲终止条件
  4. 将递推公式和终止条件翻译成代码

递归存在的问题

  • 递归代码要注意堆栈溢出的问题
    • 函数调用会使用栈来保存临时变量。每调用一个函数,都会将临时变量封装为栈帧压入内存栈,等函数执行完成返回时,才出栈。系统栈或者虚拟机栈空间一般都不大。如果递归求解的数据规模很大,调用层次很深,一直压入栈,就会有堆栈溢出的风险。
  • 递归代码重复计算
    • 在拆分的子问题中有相同的子问题
  • 时间效率上,递归使用了多次函数调用
  • 空间复杂度上,递归调用一次就会在内存栈中保存一次现场数据

递归代码

以爬楼梯为例,每次只能爬一个台阶或两个台阶,爬上n个台阶有多少种爬法。
方法一:

def walk(input):
    if input == 1:
        return 1
    if input == 2:
        return 2
    return walk(input - 1) + walk(input - 2)

上述方法存在多次函数调用及重复计算可以用一下的方式进行改进
方法二:

def walk2(input):
    if input == 1:
        return 1
    if input == 2:
        return 2
    first = 1
    second = 2
    third = 0
    for _ in range(3, input+1):
        third = first + second
        first = second
        second = third
    return second
  • 时间复杂度
    • 方法一与方法二的时间复杂度都是O(n),但是方法一使用了多次函数调用,时间复杂度更高,并有可能出现堆栈溢出。
  • 空间复杂度
    • 方法一因为要存储所有的中间结果,所以空间复杂度为O(n),方法二只需要3个空间存在中见结果所以空间复杂度为O(1)。

你可能感兴趣的:(数据结构与算法,笔记,算法)