接上前面的分支循环、函数基础这一讲我们攻克 C 语言函数递归—— 编程里最经典、最考验逻辑的知识点一篇讲透 目录什么是递归递归的两个必要限制条件递归经典举例求 n 的阶乘顺序打印整数每一位递归 vs 迭代循环效率对比栈溢出问题斐波那契数经典案例递归总结1. 什么是递归递归就是函数自己调用自己。核心思想把大事化小将一个复杂问题层层拆成与原问题相似、但规模更小的子问题直到不能再拆递归结束。最简单递归代码演示用会栈溢出#include stdio.h int main() { printf(hehe\n); main(); // 自己调用自己 return 0; }2. 递归的两个必要条件写递归必须满足否则会死递归、栈溢出有一个限制条件满足时递归停止每次递归调用后越来越接近这个限制条件3. 递归经典举例3.1 举例 1求 n 的阶乘公式n! n × (n-1)!0! 1递归代码int Fact(int n) { if(n 0) return 1; // 限制条件 else return n * Fact(n - 1); // 递推不断缩小规模 }完整测试#include stdio.h int Fact(int n) { if(n 0) return 1; else return n * Fact(n - 1); } int main() { int n 0; scanf(%d, n); int ret Fact(n); printf(%d\n, ret); return 0; }递归推演以 5! 为例plaintextFact(5) 5*Fact(4) Fact(4) 4*Fact(3) Fact(3) 3*Fact(2) Fact(2) 2*Fact(1) Fact(1) 1*Fact(0) Fact(0) 1 回归1 → 1 → 2 → 6 → 24 → 1203.2 举例 2顺序打印整数的每一位输入1234 → 输出1 2 3 4思路Print (n) 先打印 n/10 的每一位再打印 n%10递归代码void Print(int n) { if(n 9) // 限制条件9才继续拆 { Print(n / 10); // 先拆前面 } printf(%d , n % 10); // 再打印当前位 }完整测试#include stdio.h void Print(int n) { if(n 9) { Print(n / 10); } printf(%d , n % 10); } int main() { int m 0; scanf(%d, m); Print(m); return 0; }4. 递归 vs 迭代重要4.1 什么是迭代迭代就是循环for/while重复执行一段代码。4.2 递归的缺点函数调用有开销每次调用都要创建栈帧层次太深会栈溢出Stack overflow某些问题会出现大量重复计算效率极低4.3 阶乘迭代实现效率更高int Fact(int n) { int i 0; int ret 1; for(i1; in; i) { ret * i; } return ret; }4.4 经典反面案例斐波那契数公式F(1) 1F(2) 1F(n) F(n-1) F(n-2)❌ 递归写法巨慢大量重复计算int Fib(int n) { if(n 2) return 1; else return Fib(n-1) Fib(n-2); }算 n40 都要很久n50 基本卡死。✅ 迭代写法秒算int Fib(int n) { int a 1; int b 1; int c 1; while(n 2) { c a b; a b; b c; n--; } return c; }5. 递归核心总结递归 函数自己调用自己两个必要条件有限制条件、不断接近条件思路大事化小优点代码简洁、逻辑清晰缺点层次深易栈溢出、重复计算会极慢能用迭代循环高效实现的尽量不用递归✨ 结尾鼓励递归是编程逻辑思维的分水岭一开始看不懂很正常。把阶乘、打印每一位、斐波那契数这三个例子自己手推一遍、敲一遍很快就能彻底悟透对你有帮助的话欢迎点赞、收藏、关注持续更新 C 语言全套精讲