当前位置: 首页 > news >正文

C语言第6讲:函数递归

接上前面的分支循环、函数基础,这一讲我们攻克 C 语言函数递归—— 编程里最经典、最考验逻辑的知识点,一篇讲透!


📑 目录

  1. 什么是递归
  2. 递归的两个必要限制条件
  3. 递归经典举例
    • 求 n 的阶乘
    • 顺序打印整数每一位
  4. 递归 vs 迭代(循环)
    • 效率对比
    • 栈溢出问题
    • 斐波那契数经典案例
  5. 递归总结

1. 什么是递归

递归就是:函数自己调用自己

核心思想:把大事化小将一个复杂问题,层层拆成与原问题相似、但规模更小的子问题,直到不能再拆,递归结束。

最简单递归代码(演示用,会栈溢出):

#include <stdio.h> int main() { printf("hehe\n"); main(); // 自己调用自己 return 0; }

2. 递归的两个必要条件

写递归必须满足,否则会死递归、栈溢出:

  1. 有一个限制条件,满足时递归停止
  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! 为例)

plaintext

Fact(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 → 120

3.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 递归的缺点

  1. 函数调用有开销
  2. 每次调用都要创建栈帧,层次太深会栈溢出(Stack overflow)
  3. 某些问题会出现大量重复计算,效率极低

4.3 阶乘:迭代实现(效率更高)

int Fact(int n) { int i = 0; int ret = 1; for(i=1; i<=n; i++) { ret *= i; } return ret; }

4.4 经典反面案例:斐波那契数

公式:

  • F(1) = 1
  • F(2) = 1
  • F(n) = F(n-1) + F(n-2)

❌ 递归写法(巨慢,大量重复计算)

int Fib(int n) { if(n <= 2) return 1; else return Fib(n-1) + Fib(n-2); }

算 n=40 都要很久,n=50 基本卡死。

✅ 迭代写法(秒算)

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. 递归核心总结

  1. 递归 = 函数自己调用自己
  2. 两个必要条件:有限制条件、不断接近条件
  3. 思路:大事化小
  4. 优点:代码简洁、逻辑清晰
  5. 缺点:层次深易栈溢出、重复计算会极慢
  6. 能用迭代(循环)高效实现的,尽量不用递归

✨ 结尾鼓励

递归是编程逻辑思维的分水岭,一开始看不懂很正常。把阶乘、打印每一位、斐波那契数这三个例子自己手推一遍、敲一遍,很快就能彻底悟透!

对你有帮助的话,欢迎点赞、收藏、关注,持续更新 C 语言全套精讲~

http://www.jsqmd.com/news/773434/

相关文章:

  • zimage-skill:现代化图像处理技能库的设计原理与实战应用
  • 基于多标签权重与相关性的在线流特征选择算法【附代码】
  • Open-Lyrics:基于异步并发架构的高性能语音字幕生成系统设计
  • 2026年5月探访黄岩:为何台州魁峰机械的全自动吹瓶机备受青睐? - 2026年企业推荐榜
  • AISMM模型效能跃迁路径(2024企业实测数据全披露):平均运营人效提升42.6%,TOP10%团队已全面启用
  • 如何用 watchEffect 实现根据参数自动获取数据?代码简化干货
  • 2026年当前,聚焦化妆品包装专用机制造:宁波华维机械有限公司的实力与担当 - 2026年企业推荐榜
  • 通过用量看板清晰掌握团队大模型 API 调用成本与模型分布
  • AISMM架构设计不达标,IPO直接终止?2026奇点大会技术委员会主席亲授4步合规加固法
  • 2026年5月新发布:深度解析富辰新材料在氟碳漆市场的核心优势与选型指南 - 2026年企业推荐榜
  • 基于电液负载敏感的工程底盘行驶模糊PID控制【附代码】
  • 告别电脑!这5款手机自动化脚本App,让你躺着搞定日常重复操作(附详细对比)
  • 数字控制技术在DC/DC转换器中的高效应用
  • 【软考高级架构】案例题考前突击13:SAAM / ATAM / CBAM
  • 《玩转OpenClaw内置诊断,建立属于自己的部署运维逻辑》
  • 2026年Q2山东商务用茶优选:青岛新辉盛正山小种源头直供实力解析 - 2026年企业推荐榜
  • ARM AMBA Timer模块原理与应用详解
  • 如何用CellProfiler实现生物图像自动分析:从手动处理到批量智能化的完整指南
  • 事件驱动爬虫框架claw.events:构建高解耦、可扩展的数据采集系统
  • Zotero Style:如何用可视化进度条和智能标签管理提升文献阅读效率
  • AISMM如何重构金融云成本治理?2026奇点大会首曝FinOps 3.0量化模型与ROI验证数据
  • 3分钟搞定!Windows安装APK的终极方案:APK-Installer完全指南
  • 2026年如何部署Hermes Agent/OpenClaw?阿里云部署指南及Coding Plan配置解析
  • return 的迷途:try-catch-finally 中 return 的诡异顺序与 Spring 事务暗坑
  • 2026年至今双缸双向阻尼品牌综合**:济南瀚霸技术领跑者引领行业新标准 - 2026年企业推荐榜
  • 从评价指标反推损失函数:拆解YDTR论文中SSIM与空间频率(SF)损失的PyTorch实现
  • 【AI Engineering · Harness 系列】02 确定性外壳 × 非确定性内核——git push 红线的故事
  • 从语音到智能体:构建语音交互式AI系统的架构与实践
  • NLP情感分析:从传统方法到深度学习
  • 用于柔性机械臂的低频动力吸振器设计及其主动控制刚柔耦合【附代码】