• 数据结构和算法-递归


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

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

    递归需要满足以下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
      

    注意

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

    资料

    • 数据结构和算法之美-王争
    • <<大话数据结构>>-程杰
    • <<漫画算法>>
    • <<数据结构和算法>>
  • 相关阅读:
    架构师维度理解 程序=数据+算法
    vuejs 中 select 动态填充数据,后台的数据
    vuejs 的错误代码,有助于理解
    graphviz 绘制架构图
    graphviz 布局和子图,表格教程
    graphviz layer 教程(非布局)
    待学习
    Linux进程管理
    TCP连接的11种状态,三次握手四次挥手原因
    Linux基本命令使用(三)
  • 原文地址:https://www.cnblogs.com/zlone/p/11012073.html
Copyright © 2020-2023  润新知