一、递归的核心概念
1.1 什么是递归?
递归(Recursion)是一种编程技巧,指函数直接或间接调用自身来解决问题的方法。它通过将大问题分解为结构相同的小问题,直到遇到可以直接解决的简单情况(递归终止条件)。
生活中的递归类比:
- 俄罗斯套娃:每个娃娃的结构相同,但尺寸逐渐缩小
- 数学归纳法:通过已知n=k的情况推导n=k+1的情况
- 拆快递包裹:不断拆开盒子,直到找到最终物品
1.2 递归三要素
- 终止条件(Base Case):递归结束的条件,防止无限递归
- 递归步骤(Recursive Case):将问题分解为更小的同类问题
- 参数演进:每次递归调用时,参数必须向终止条件靠近
二、实例精讲
2.1 阶乘计算(数学问题)
问题分析:
- 阶乘定义:n! = n × (n-1) × … × 1
- 递归关系:n! = n × (n-1)!
- 终止条件:0! = 1
代码实现:
def factorial(n):
if n == 0: # 终止条件
return 1
return n * factorial(n-1) # 递归步骤
执行过程可视化:
计算factorial(3)的步骤:
1. factorial(3) → 3 × factorial(2)
2. factorial(2) → 2 × factorial(1)
3. factorial(1) → 1 × factorial(0)
4. factorial(0) → 1 (触发终止条件)
5. 逐层返回结果:1 → 1×1 → 2×1 → 3×2 → 6
2.2 斐波那契数列(重复计算问题)
问题分析:
- 数列定义:F(0)=0, F(1)=1, F(n)=F(n-1)+F(n-2)
- 递归树示例(F(5)):
F(5) / \ F(4) F(3) / \ / \ F(3)F(2)F(2)F(1) ...(继续分解)...
基础实现:
def fib(n):
if n <= 1:
return n
return fib(n-1) + fib(n-2) # 存在重复计算
优化方案(记忆化技术):
from functools import lru_cache
@lru_cache(maxsize=None) # 使用缓存保存已计算结果
def fib(n)