递归算法

一、递归基础概念

  1. 递归定义
  • 递归:函数直接或间接调用自身的过程
  • 核心思想:将大问题分解为相同结构的小问题
  • 必要条件
    • 递归表达式(递推关系)
    • 边界条件(终止条件)
  1. 递归实现要素

确定递推关系:找出问题规模与子问题规模的关系
递归调用:函数调用自身解决更小规模的子问题
终止条件:明确最简单情况的处理方式,防止无限递归


二、参数传递机制

  1. 值传递 vs 地址传递

值传递(示例中fun1

void fun1(int x) {
    x++;  // 修改的是局部副本
}

特点:

  • 传递变量的副本
  • 函数内修改不影响原始变量
  • 适用于基本数据类型(int, float, char等)

地址传递(示例中fun2

void fun2(int a[]) {
    a[0]++;  // 修改原始数组元素
}

特点:

  • 传递内存地址(指针)
  • 函数内修改影响原始数据
  • 适用于数组和复杂数据结构
  1. 内存模型解析
  • 函数调用栈:每次函数调用创建新的栈帧,存储局部变量
  • 变量作用域:各函数的局部变量相互隔离
  • 数组传递:数组名退化为指针,传递的是首地址

三、递归优化技巧

  1. 避免重复计算
  • 使用记忆化(Memoization)存储中间结果
  • 示例:斐波那契数列递归优化
  1. 尾递归优化
  • 将递归调用放在函数最后一步
  • 可被编译器优化为迭代,减少栈空间使用
  1. 递归转迭代
  • 复杂递归问题可考虑用循环+栈结构实现
  • 优点:避免栈溢出,提高效率

四、注意事项

  1. 确保递归有终止条件
  2. 注意递归深度可能导致的栈溢出
  3. 对于性能敏感场景,考虑迭代替代方案
  4. 理解参数传递方式对程序行为的影响
posted @ 2025-04-22 15:32  Jason227  阅读(48)  评论(0)    收藏  举报