数据结构和算法-递归

去的过程叫, 回的过程叫, 解决递归问题最重要的两步是

  • 写递推公式
  • 找到终止条件

递归需要满足以下3个条件

  • 一个问题可以分解为多个子问题(数据规模更小的问题)
  • 主问题和分解后的子问题求解思路相同 - 基线条件
  • 存在递归终止条件

使用递归计算列表和

def add(nums):
    if len(nums) == 1:    # 终止条件
        return nums[0]
    return nums[0] + add(nums[1:])    # 递推公式


res = add(range(4))
print(res)

计算台阶问题

  • 终止条件
    f(1) = 1
    f(2) = 2

  • 递推公式
    f(n) = f(n-1) + f(n-2)

    # coding:utf-8
    
    """
    台阶问题
    
    一共有7个台阶, 每一次只能走1个或2个, 有几种走法
    
    可以分为2类, 第一次走1个和第一次走2个
    f(n) = f(n-1) + f(n-2)
    
    终止条件是
    f(1) = 1, f(2) = 2
    """
    
    cache = {}  # 加上运算值的缓存, 避免出现重复计算
    
    def f_0(n):
        if n == 1:
            return 1
        if n == 2:
            return 2
        if n in cache:
            return cache[n]
        else:
            cache[n] = f_0(n - 1) + f_0(n - 2)
            return cache[n]
    
    

    改为非递归方式

    def f_1(n):
        """改为非递归形式"""
        if n == 1:
            return 1
        if n == 2:
            return 2
        x, y = 1, 2
        for _ in range(3, n + 1):
            x, y = y, x + y
        return y
    

注意

  • 递归调用可能导致堆栈溢出
  • 避免出现重复计算

资料

  • 数据结构和算法之美-王争
  • <<大话数据结构>>-程杰
  • <<漫画算法>>
  • <<数据结构和算法>>
原文地址:https://www.cnblogs.com/zlone/p/11012073.html