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

发布时间:2026/7/10 22:31:57

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/7/10 22:21:57

抖音批量下载神器: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/7/10 22:21:57

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

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

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

2026/7/10 22:21:57

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

每日穿搭助手:鸿蒙AI应用开发实战——AI衣橱,每日穿搭不再愁

每日穿搭助手:鸿蒙AI应用开发实战——AI衣橱,每日穿搭不再愁

2026/7/11 0:02:03

每日穿搭助手:鸿蒙AI应用开发实战——AI衣橱,每日穿搭不再愁 一、引言 每天早上打开衣柜,面对满柜的衣服却不知道穿什么——这是无数人的日常困扰。气温变化、场合差异、风格偏好,这些因素交织在一起,让"穿什么&q…

工业信号干扰处理与FOD4216光耦应用实战

工业信号干扰处理与FOD4216光耦应用实战

2026/7/11 0:02:03

1. 工业环境中的信号干扰挑战在工业自动化领域,信号采集的准确性直接关系到整个控制系统的可靠性。典型的工业现场充斥着各种干扰源:大功率电机启停产生的电磁干扰、变频器工作产生的高频噪声、继电器触点火花放电,以及长距离传输引入的共模干…

PostgreSQL 备份与恢复实战:从 pg_dump 到时间点恢复的生产级方案

PostgreSQL 备份与恢复实战:从 pg_dump 到时间点恢复的生产级方案

2026/7/11 0:02:03

PostgreSQL 备份与恢复实战:从 pg_dump 到时间点恢复的生产级方案 一、数据库备份最容易被忽略的问题,不是「有没有做备份」,而是「备份能不能恢复、恢复要多久、以及恢复后的数据对不对」 很多团队做数据库备份的方式是「写个 cron job&am…

5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 [特殊字符]

5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 [特殊字符]

2026/7/11 0:02:03

5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 🎬 【免费下载链接】zimuku_for_kodi Kodi 插件,用于从「字幕库」网站下载字幕 项目地址: https://gitcode.com/gh_mirrors/zi/zimuku_for_kodi 还记得那个深夜吗?你刚下载…

WechatDecrypt技术解析:深入理解微信数据库AES-256-CBC解密机制

WechatDecrypt技术解析:深入理解微信数据库AES-256-CBC解密机制

2026/7/11 0:02:03

WechatDecrypt技术解析:深入理解微信数据库AES-256-CBC解密机制 【免费下载链接】WechatDecrypt 微信消息解密工具 项目地址: https://gitcode.com/gh_mirrors/we/WechatDecrypt 在数字隐私日益重要的今天,微信聊天记录作为个人数字资产的重要组成…

运维革命的背后:云管理通道介绍

运维革命的背后:云管理通道介绍

2026/7/10 23:52:03

1.1云管道简介云管理通道。这是现代网络设备(尤其是企业级路由器、交换机、防火墙、AP等)实现集中化、可视化、自动化运维的核心技术基础。简单说,它就是设备与云端管理平台之间建立的一条安全、可靠、可管理的通信链路。1.2云管道的价值云管…

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南

2026/7/10 22:32:48

解锁AMD Ryzen处理器深层性能:SMU Debug Tool完全指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gi…

6个月转型AI工程师:实战路径与核心技能

6个月转型AI工程师:实战路径与核心技能

2026/7/9 18:28:30

1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公…

YOLOv5模型剪枝与量化实战:边缘设备部署优化

YOLOv5模型剪枝与量化实战:边缘设备部署优化

2026/7/10 6:57:56

1. 项目背景与核心价值在计算机视觉领域,YOLOv5因其出色的实时检测性能成为工业界宠儿。但当我们尝试将其部署到边缘设备(如树莓派、Jetson Nano或手机终端)时,立刻会遇到两个致命问题:模型体积庞大(原始YO…

WechatDecrypt技术解析:深入理解微信数据库AES-256-CBC解密机制

WechatDecrypt技术解析:深入理解微信数据库AES-256-CBC解密机制

2026/7/11 0:02:03

WechatDecrypt技术解析:深入理解微信数据库AES-256-CBC解密机制 【免费下载链接】WechatDecrypt 微信消息解密工具 项目地址: https://gitcode.com/gh_mirrors/we/WechatDecrypt 在数字隐私日益重要的今天,微信聊天记录作为个人数字资产的重要组成…

5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 [特殊字符]

5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 [特殊字符]

2026/7/11 0:02:03

5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 🎬 【免费下载链接】zimuku_for_kodi Kodi 插件,用于从「字幕库」网站下载字幕 项目地址: https://gitcode.com/gh_mirrors/zi/zimuku_for_kodi 还记得那个深夜吗?你刚下载…

PostgreSQL 备份与恢复实战:从 pg_dump 到时间点恢复的生产级方案

PostgreSQL 备份与恢复实战:从 pg_dump 到时间点恢复的生产级方案

2026/7/11 0:02:03

PostgreSQL 备份与恢复实战:从 pg_dump 到时间点恢复的生产级方案 一、数据库备份最容易被忽略的问题,不是「有没有做备份」,而是「备份能不能恢复、恢复要多久、以及恢复后的数据对不对」 很多团队做数据库备份的方式是「写个 cron job&am…