C语言递归函数笔记(函数自己调自己)

发布时间:2026/9/6 17:25:36

C语言递归函数笔记(函数自己调自己)
一、什么是递归递归 就是一个函数在它自己的定义里 调用它自己。有点像俄罗斯套娃或者镜子里的镜子。最简单的例子虽然是无限递归别真跑cvoidinfinity(){printf(again\n);infinity();// 自己叫自己}没有停止条件会一直调直到栈爆掉。二、递归的两个必要条件终止条件基例什么时候不再递归直接返回结果。递归步骤把大问题拆成更小的同类问题不断逼近终止条件。三、经典例子阶乘数学定义0!1n!n*(n-1)!n0写成递归cintfactorial(intn){if(n1)return1;// 终止条件elsereturnn*factorial(n-1);// 递归n! n * (n-1)!}调用 factorial(3) 时发生了什么textfactorial(3)-3*factorial(2)factorial(2)-2*factorial(1)factorial(1)-1返回1 - 2 - 6先一层层往下递到底了再一层层往回归所以叫“递归”。四、栈的作用回顾一下每次函数调用系统会在 栈 上分配一个 栈帧用来存参数局部变量返回地址之后要回到哪里递归调用时每深入一层就新建一个栈帧返回时再逐层销毁。画个图n3text main 调用factorial(3) 栈底[main][factorial(3)参数3,返回地址main...][factorial(2)参数2][factorial(1)参数1]栈顶返回来时从顶往下弹。所以递归太深会 栈溢出Stack Overflow就是栈帧太多把栈空间占满了。五、经典例子斐波那契数列定义fib(0)0, fib(1)1, fib(n)fib(n-1)fib(n-2)cintfib(intn){if(n0)return0;if(n1)return1;returnfib(n-1)fib(n-2);}问题是效率极低重复计算太多。比如 fib(5) 要算textfib(5)/\fib(4)fib(3)/\/\fib(3)fib(2)fib(2)fib(1)/\/\/\fib(2)fib(1)...很多节点重复计算。fib(40) 就能跑到几亿次调用卡死你。优化方法记忆化把算过的存起来或用循环。六、递归 vs 循环方面 递归 循环代码简洁性 某些问题极简树、汉诺塔 一般代码量略多效率 有函数调用开销 快内存 每层占栈空间 只需几个变量风险 容易栈溢出 一般不会适合场景 问题本身就是递归定义文件目录、树、图 大部分普通迭代经验能用循环就别用递归除非递归写起来明显清晰很多且深度不会太大。七、尾递归能优化的递归尾递归递归调用是函数的 最后一步操作之后没有其他计算。阶乘通常写法不是尾递归因为要 n * factorial(n-1)乘号在递归返回之后才做。改成尾递归cintfactorial_tail(intn,intacc){if(n1)returnacc;returnfactorial_tail(n-1,n*acc);}// 调用factorial_tail(5, 1)尾递归的好处是某些编译器可以优化成循环不再新建栈帧省内存。但很多C编译器不自动做尾递归优化需要开优化选项权当了解一下。八、经典的递归例子练手用字符串反转递归版cvoidreverse(char*s){if(*s\0)return;reverse(s1);putchar(*s);}// 输入abc输出cba汉诺塔cvoidhanoi(intn,charfrom,charto,charaux){if(n1){printf(Move disk 1 from %c to %c\n,from,to);return;}hanoi(n-1,from,aux,to);printf(Move disk %d from %c to %c\n,n,from,to);hanoi(n-1,aux,to,from);}遍历二叉树数据结构里会学cvoidinorder(TreeNode*root){if(!root)return;inorder(root-left);printf(%d ,root-val);inorder(root-right);}九、常见坑和调试建议没有终止条件或条件永远达不到→ 无限递归 → 栈溢出崩掉。递归深度太大比如 fib(100000) 直接炸。一般栈空间默认约1~8MB深度几百到几千就可能崩看参数大小。重复计算像斐波那契那样加个缓存数组存中间结果。返回局部变量地址与递归无关但容易犯int* bad() { int x5; return x; } 返回栈地址。调试递归可以加个缩进参数打印每次进入和退出方便看调用顺序。cvoiddebug_fact(intn,intdepth){for(inti0;idepth;i)printf( );printf(fact(%d)\n,n);if(n1)return;debug_fact(n-1,depth1);}十、什么时候该用递归问题本身是递归结构文件系统目录树、JSON/XML解析、递归下降解析器。分治算法快速排序、归并排序虽然递归也有限制但深度logN安全。动态规划有时递归记忆化更直观。写一些面试题比如逆序打印字符串。十一、总结背几句就行递归 自己调用自己 终止条件。每层调用消耗栈空间太深会崩。递归能写得很简短但往往不如循环高效。写递归前先想怎么把问题变小什么时候停下来。调试时可以从小的输入开始比如n1,2,3手动模拟一下。多写几个递归函数比如求最大公约数辗转相除法、数的二进制表示、判断回文字符串练多了就自然了。递归就像剥洋葱一层一层剥到心再往回包。

相关新闻

抖音批量下载神器:3步搞定主页作品,效率提升90%的秘密武器

抖音批量下载神器:3步搞定主页作品,效率提升90%的秘密武器

2026/8/28 8:04:51

抖音批量下载神器:3步搞定主页作品,效率提升90%的秘密武器 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser…

A3910与PIC18F2585在电机控制中的高效应用

A3910与PIC18F2585在电机控制中的高效应用

2026/9/5 16:15:26

1. 认识A3910与PIC18F2585这对黄金搭档 在嵌入式控制领域,电机驱动与微控制器的组合就像咖啡与牛奶的完美融合。A3910作为一款高性能全桥电机驱动芯片,配合PIC18F2585这颗工业级微控制器,能够构建出稳定可靠的智能控制系统。这套组合特别适合…

pip 22.0+ 配置源实战:3种方法覆盖Linux/Windows/macOS,附7大国内源对比

pip 22.0+ 配置源实战:3种方法覆盖Linux/Windows/macOS,附7大国内源对比

2026/9/4 16:55:06

pip 22.0 多平台配置源实战指南:7大国内镜像深度评测刚接触Python开发时,最令人崩溃的瞬间莫过于看着pip安装进度条像蜗牛一样缓慢爬行。记得第一次在Windows上安装TensorFlow时,我盯着那个以KB/s为单位跳动的下载速度,一度怀疑自…

光模块详解:从光电转换原理到核心芯片与MCU选型

光模块详解:从光电转换原理到核心芯片与MCU选型

2026/9/6 17:21:06

简介:这份光模块基础知识培训PPT,面向通信工程师、网络运维人员及光通信初学者,系统讲解光模块从原理到应用的核心知识体系。资源为1个PPT文件,压缩包大小7.8MB,内容覆盖光模块定义与光电转换流程、数字/模拟光模块对比…

大学物理第五版马文蔚课后答案PDF别只用来对答案!掌握这套高效刷题法

大学物理第五版马文蔚课后答案PDF别只用来对答案!掌握这套高效刷题法

2026/9/6 17:21:06

简介:大学物理第五版马文蔚课后答案.pdf是一份面向理工科本科生、备考学生及物理自学者的习题解析文档。它针对马文蔚《大学物理》第五版的课后习题,逐题给出解答与剖析,尤其在质点运动学部分深入辨析位移与路程、径向速率与速度、切向加速度…

马文蔚《大学物理》第五版课后答案高效使用指南

马文蔚《大学物理》第五版课后答案高效使用指南

2026/9/6 17:21:06

简介:大学物理第五版马文蔚课后答案,围绕马文蔚《大学物理》第五版教材编写,适用于使用该教材的理工科本科生日常习题练习、期末复习,也适合考研备考生对照教材巩固基础。资源为一个7.83MB的PDF文件,内容以章节为单位给…

Delphi 安卓开发环境搭建全攻略:SDK/NDK/JDK 配置与踩坑实录

Delphi 安卓开发环境搭建全攻略:SDK/NDK/JDK 配置与踩坑实录

2026/9/6 17:21:06

简介:面向 Delphi 121 环境下的安卓 SDK 配置需求,这份教程针对安卓开发初学者和刚从 IDE 集成开发环境转向移动端开发的工程师,重点解决 PlatformSDKs 解压、IDE 内 SDK Manager 替换、以及 Android SDK/NDK/JDK 路径对接等常见问题。包体为…

Delphi 121安卓开发环境配置指南:SDK、NDK与JDK的完整搭建与排坑

Delphi 121安卓开发环境配置指南:SDK、NDK与JDK的完整搭建与排坑

2026/9/6 17:21:05

简介:针对 Embarcadero Delphi 环境中安卓 SDK 配置复杂、路径易错的问题,这份 PDF 教程以轻量形式提供完整解决方案,包体仅 1 个文件共 1.3MB。内容从解压 PlatformSDKs 压缩包开始,细致演示在 IDE 的 SDK Manager 中删除旧配置、…

猫抓视频嗅探:五分钟把网页视频存到本地的完整指南

猫抓视频嗅探:五分钟把网页视频存到本地的完整指南

2026/9/6 17:11:05

猫抓视频嗅探:五分钟把网页视频存到本地的完整指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 打开网页,视频能正常播放…

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

2026/9/6 1:19:56

本文首发于“生态学者”!从“湿地面积”到“土壤碳密度”:为什么需要重新认识潮汐湿地蓝碳变化?潮汐湿地位于陆地与海洋的交汇地带,包括红树林、盐沼和潮滩,是全球重要的蓝碳生态系统。其土壤能够长期储存大量有机碳&a…

adb抓包

adb抓包

2026/9/6 1:19:56

前言 本文介绍如何通过 tcpdump 在 Android 手机上抓取网络数据包,并在电脑端使用 Wireshark 进行分析。适用于需要排查 App 网络请求、分析接口调用或调试网络问题的开发与测试场景。1. 手机要有 root 权限2. 下载 tcpdump3. adb push C:\Users\zhangkuixun\Downlo…

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

2026/9/6 1:19:56

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战 在云原生基础设施中,容器镜像体积直接决定了服务的部署速度与弹性扩容敏捷度。对于传统的 Go / Java 微服务,镜像体积通常被严格控制在 50MB 到 200MB 以内,拉取镜像只…

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

2026/9/6 1:19:56

本文首发于“生态学者”!从“湿地面积”到“土壤碳密度”:为什么需要重新认识潮汐湿地蓝碳变化?潮汐湿地位于陆地与海洋的交汇地带,包括红树林、盐沼和潮滩,是全球重要的蓝碳生态系统。其土壤能够长期储存大量有机碳&a…

adb抓包

adb抓包

2026/9/6 1:19:56

前言 本文介绍如何通过 tcpdump 在 Android 手机上抓取网络数据包,并在电脑端使用 Wireshark 进行分析。适用于需要排查 App 网络请求、分析接口调用或调试网络问题的开发与测试场景。1. 手机要有 root 权限2. 下载 tcpdump3. adb push C:\Users\zhangkuixun\Downlo…

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

2026/9/6 1:19:56

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战 在云原生基础设施中,容器镜像体积直接决定了服务的部署速度与弹性扩容敏捷度。对于传统的 Go / Java 微服务,镜像体积通常被严格控制在 50MB 到 200MB 以内,拉取镜像只…

远程协作的工作台整理

远程协作的工作台整理

2026/9/3 6:56:24

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/4 7:42:10

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/5 23:14:13

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…