递归算法
一、递归基础概念
- 递归定义
- 递归:函数直接或间接调用自身的过程
- 核心思想:将大问题分解为相同结构的小问题
- 必要条件:
- 递归表达式(递推关系)
- 边界条件(终止条件)
- 递归实现要素
确定递推关系:找出问题规模与子问题规模的关系
递归调用:函数调用自身解决更小规模的子问题
终止条件:明确最简单情况的处理方式,防止无限递归
二、参数传递机制
- 值传递 vs 地址传递
值传递(示例中fun1)
void fun1(int x) {
x++; // 修改的是局部副本
}
特点:
- 传递变量的副本
- 函数内修改不影响原始变量
- 适用于基本数据类型(int, float, char等)
地址传递(示例中fun2)
void fun2(int a[]) {
a[0]++; // 修改原始数组元素
}
特点:
- 传递内存地址(指针)
- 函数内修改影响原始数据
- 适用于数组和复杂数据结构
- 内存模型解析
- 函数调用栈:每次函数调用创建新的栈帧,存储局部变量
- 变量作用域:各函数的局部变量相互隔离
- 数组传递:数组名退化为指针,传递的是首地址
三、递归优化技巧
- 避免重复计算
- 使用记忆化(Memoization)存储中间结果
- 示例:斐波那契数列递归优化
- 尾递归优化
- 将递归调用放在函数最后一步
- 可被编译器优化为迭代,减少栈空间使用
- 递归转迭代
- 复杂递归问题可考虑用循环+栈结构实现
- 优点:避免栈溢出,提高效率
四、注意事项
- 确保递归有终止条件
- 注意递归深度可能导致的栈溢出
- 对于性能敏感场景,考虑迭代替代方案
- 理解参数传递方式对程序行为的影响

浙公网安备 33010602011771号