C语言基本笔记(11)—— 递归函数
递归函数
递归函数通过直接或间接调用自身解决问题,需满足:
- 终止条件(Base Case):确保递归最终停止。
- 递归步骤(Recursive Step):每次调用向终止条件逼近。
// 示例:递归计算阶乘
int factorial(int n) {
if (n <= 1) return 1; // 终止条件
else return n * factorial(n-1); // 递归步骤
}
-
应用
- 树/图的遍历(如文件系统解析)。
- 分治算法(如快速排序)。
-
风险
- 栈溢出风险:嵌入式系统栈空间有限,深递归易导致崩溃。
- 实时性影响:递归调用可能引入不可预测的时间延迟。
-
解决方法
-
栈溢出 :
-
改用迭代或状态机。
-
限制递归深度(如设置最大层级阈值)。
-
使用静态/全局变量减少栈占用。
-
缺失终止条件导致无限递归 :
- 严格验证边界条件(如负数输入)。
-
在嵌入式开发中的递归函数
- 递归函数替代方案
- 迭代实现:手动管理状态,避免栈溢出。
// 迭代计算阶乘 int factorial_iter(int n) { int result = 1; for (int i=1; i<=n; i++) { result *= i; } return result; } - 状态机:适用于多步骤异步任务(如协议解析)。
- 在资源受限的嵌入式系统中,递归需谨慎使用。若必须使用,需确保:
-
- 递归深度可控(如设置阈值)。
-
- 优先考虑尾递归优化(需确认编译器支持)。
-
- 替代方案(如迭代)无法满足需求。
- 递归和迭代如何选择?选择依据包括:
-
- 可读性:递归更直观(如树遍历)。
-
- 资源限制:嵌入式系统优先选择迭代。
-
- 性能需求:迭代通常更高效且确定性更强。
浙公网安备 33010602011771号