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

C语言论递归函数及其本质

一个函数在函数体内又调用了本身,我们称为递归调用,这样的函数就是递归函数。

递归函数成功执行需满足以下两个条件:

  1. 必须有一个明显的结束条件。
  2. 必须有一个趋近于结束条件的趋势。

举个生活例子:数钱

假设你有一叠钞票,想知道总数,但只能一张一张数。递归的做法是:

  1. 终止条件:如果只剩一张钞票,直接返回 1。

  2. 递归步骤:每次数一张,然后把剩下的钞票交给“另一个人”用同样的方法数(实际上还是你自己数,但问题规模变小了)。

用代码表示:

int count_money(int n) {
    if (n == 1) {        // 终止条件:只剩一张
        return 1;
    } else {             // 递归步骤:数一张,剩下的交给下一层
        return 1 + count_money(n - 1);
    }
}

当你调用 count_money(5),实际执行过程是:
5 → 4 → 3 → 2 → 1(终止条件满足),然后倒着返回结果:
1 → 2 → 3 → 4 → 5,最终得到总数 5。


递归的底层原理

计算机通过栈(Stack) 来管理递归调用:

  • 每次调用函数时,当前状态(变量值、执行位置等)会被压入栈中。

  • 遇到终止条件后,开始从栈顶一层层弹出状态,倒着计算结果。

  • 如果递归太深(比如没有终止条件),栈会被塞满,导致程序崩溃(Stack Overflow)。

“倒着返回结构”的本质是栈的 FILO 特性,它强制递归函数先解决最小的问题,再逐层回溯解决更大的问题。这种机制虽然直观,但需要警惕栈溢出的风险(例如无终止条件的递归)。理解递归的关键是想象调用栈如何逐步展开和回溯。


递归 vs 循环

  • 递归:像俄罗斯套娃,一层层打开直到最小的娃娃,再一层层装回去。代码简洁,但可能效率低(占用内存多)。

  • 循环:像流水线作业,从头到尾直接处理。效率高,但代码可能更复杂。


什么时候用递归?

适合处理自相似问题(大问题能分解成小问题,且小问题和大问题的解法相同):

  • 阶乘计算(5! = 5 × 4!

  • 斐波那契数列(fib(n) = fib(n-1) + fib(n-2)

  • 遍历树或文件夹结构(一个文件夹里可能有子文件夹)


总结:递归就是“把大象装进冰箱,但冰箱里还有一个冰箱,直到遇到一个空冰箱”——关键在于找到终止条件,否则永远装不完! 🐘❄️

相关文章:

  • 【FAQ】HarmonyOS SDK 闭源开放能力 —Map Kit(6)
  • 中兴B860AV3.2-T/B860AV3.1-T2_S905L3-B_2+8G_安卓9.0_先线刷+后卡刷固件-完美修复反复重启瑕疵
  • Linux--内核进程O(1)调度队列
  • 20分钟上手DeepSeek开发:SpringBoot + Vue2快速构建AI对话系统
  • 画册相册图库摄影画廊H5开源版开发
  • 论文阅读:SCI 1区 RADAR: Robust AI-Text Detection via Adversarial Learning
  • TypeScript + Vue:类风格组件如何引领前端新潮流?
  • 植物知识分享论坛毕设
  • Python基础语法全解析:从入门到实践
  • Qt中打开windows的cmd窗口并显示
  • Git 使用SSH登陆
  • 工厂方法模式和抽象工厂模式详解
  • 【从零开始学习计算机科学与技术】计算机网络(六)传输层
  • 调整iptables规则,解决无法ssh连接服务器的问题
  • Linux中安装Git
  • Javascript 日期相关计算
  • halcon几何测量(二)计算距离和角度的函数
  • Linux主机持久化技术
  • 日常学习开发记录-input组件
  • 数据库设计实验(3)—— 分离与附加、还原与备份
  • 辽宁援疆前指总指挥王敬华已任新疆塔城地委副书记
  • 澎湃与七猫联合启动百万奖金征文,赋能非虚构与现实题材创作
  • 标普500指数连涨四日,大型科技股多数下跌
  • 女孩患异食癖爱吃头发,一年后腹痛入院体内惊现“头发巨石”
  • “中国神湖”加快放大资源规模!3亿美元换海外年产380万吨钾盐项目
  • 山东市监局回应“盒马一批次‘无抗’鸡蛋抽检不合格后复检合格”:系生产商自行送检