去的过程叫递
, 回的过程叫归
, 解决递归问题最重要的两步是
- 写递推公式
- 找到终止条件
递归需要满足以下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
注意
- 递归调用可能导致堆栈溢出
- 避免出现重复计算
资料
- 数据结构和算法之美-王争
- <<大话数据结构>>-程杰
- <<漫画算法>>
- <<数据结构和算法>>