C语言基本笔记(11)—— 递归函数

递归函数

递归函数通过直接或间接调用自身解决问题,需满足:

  • 终止条件(Base Case):确保递归最终停止。
  • 递归步骤(Recursive Step):每次调用向终止条件逼近。
// 示例:递归计算阶乘
int factorial(int n) {
    if (n <= 1) return 1;       // 终止条件
    else return n * factorial(n-1); // 递归步骤
}
  • 应用

    • 树/图的遍历(如文件系统解析)。
    • 分治算法(如快速排序)。
  • 风险

    • 栈溢出风险:嵌入式系统栈空间有限,深递归易导致崩溃。
    • 实时性影响:递归调用可能引入不可预测的时间延迟。
  • 解决方法

    • 栈溢出

    • 改用迭代或状态机。

    • 限制递归深度(如设置最大层级阈值)。

    • 使用静态/全局变量减少栈占用。

    • 缺失终止条件导致无限递归

      • 严格验证边界条件(如负数输入)。

在嵌入式开发中的递归函数

  1. 递归函数替代方案
  • 迭代实现:手动管理状态,避免栈溢出。
    // 迭代计算阶乘
    int factorial_iter(int n) {
        int result = 1;
        for (int i=1; i<=n; i++) {
            result *= i;
        }
        return result;
    }
    
  • 状态机:适用于多步骤异步任务(如协议解析)。
  1. 在资源受限的嵌入式系统中,递归需谨慎使用。若必须使用,需确保:
    1. 递归深度可控(如设置阈值)。
    1. 优先考虑尾递归优化(需确认编译器支持)。
    1. 替代方案(如迭代)无法满足需求。
  1. 递归和迭代如何选择?选择依据包括:
    1. 可读性:递归更直观(如树遍历)。
    1. 资源限制:嵌入式系统优先选择迭代。
    1. 性能需求:迭代通常更高效且确定性更强。
posted @ 2025-04-28 11:04  故渊Y  阅读(153)  评论(0)    收藏  举报