C语言递归函数笔记(函数自己调自己)
📅 2026/7/10 22:32:05
👁️ 次浏览
一、什么是递归递归 就是一个函数在它自己的定义里 调用它自己。有点像俄罗斯套娃或者镜子里的镜子。最简单的例子虽然是无限递归别真跑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手动模拟一下。多写几个递归函数比如求最大公约数辗转相除法、数的二进制表示、判断回文字符串练多了就自然了。递归就像剥洋葱一层一层剥到心再往回包。
1.数据类型的介绍数据类型主要描述生活中的场景。类型:相似的数据所拥有的共同特征,编译器只有知道了数据的类型,才知道怎么操作数据。 使用整型类型来描述整数,使用字符类型来描述字符,使用浮点型类型来描述小数。货…
📅 2026/7/10 22:31:05
目录
前言
接入 Claude Code
1. 安装 Claude Code
2. cc-switch配置(点击的教程)
安装cc-switch
设置
创建token
使用token
测试是否连接上deepseek。
3. 配置环境变量
flash的配置文件
pro配置文件
4. 进入项目目录,执行 claud…
📅 2026/7/10 22:31:05
Alexa AI 改进:剑指多步骤任务处理据《商业内幕》报道,亚马逊的相关项目正致力于对 Alexa AI 进行大幅改进,目标是让其能够处理更高级的多步骤任务。这一改进方向与谷歌、OpenAI 等 AI 领域领先者的做法一致,意味着 Alexa AI 试图…
📅 2026/7/10 22:31:05
1. 项目概述:为什么UE5渲染调优是每个开发者的必修课最近在社区里看到不少朋友在讨论UE5项目性能卡顿的问题,画面撕裂、帧数不稳、显卡风扇狂转但效果平平,这些痛点我太熟悉了。我自己从UE4过渡到UE5,也经历了从“哇,画…
📅 2026/7/11 1:43:06
1. 项目背景与核心目标解析在便携式电子设备设计中,电池寿命和电流输出能力始终是工程师面临的两大核心挑战。NBM5100A作为一款高效电源管理IC,与MKV42F256VLH16微控制器的组合,为解决这一难题提供了专业级方案。这套方案特别适用于需要长时间…
📅 2026/7/11 1:43:06
1. 引言:从自然语言到代码的自动化在微服务开发中,定义和实现API端点是一个重复性高、容易出错的过程。开发者需要编写控制器(Controller)、服务层(Service)、数据模型(Model)以及相…
📅 2026/7/11 1:43:06
第02篇:String底层原理与字符串面试全集 模块:Java核心基础 | 难度:基础 | 面试频率:★★★★★ 1. String / StringBuilder / StringBuffer 的区别?为什么 StringBuilder 线程不安全?
核心对比 特性 String StringBuilder StringBuffer 可变性 不可变 可变 可变 线程安…
📅 2026/7/11 1:43:06
1. 项目背景与核心需求在锂离子电池组应用中,电压平衡是确保电池组安全性和寿命的关键技术。当多个电池串联使用时,由于制造工艺差异、温度分布不均等因素,各单体电池的电压会出现不一致现象。这种不平衡如果长期存在,会导致部分电…
📅 2026/7/11 1:43:06
第06篇:Java注解机制详解 模块:Java核心基础 | 难度:进阶 | 面试频率:★★★★☆ 1. 注解的本质是什么?Retention 三种策略的区别?
注解的本质
注解(Annotation)从 JDK 5 引入,本质是一个继承了 java.lang.annotation.Annotation 接口的特殊接口。
// 定义一个注解…
📅 2026/7/11 1:42:05
摘要前面系列教程覆盖了 ArkUI 组件、路由、生命周期、本地存储、网络请求、Ability 底层全套基础能力,本篇统一梳理标准工程目录分层、模块化拆分、代码复用规范、全局工具统一管理、项目打包权限配置、常见工程报错统一解决方案,形成可直接用于课程设计…
📅 2026/7/11 0:00:31
1. 命令简介gpm 是 Linux 系统下运行于虚拟控制台(文字终端模式)的鼠标服务器。它的主要功能是在没有图形界面的纯文本环境中,为虚拟控制台提供鼠标支持,允许用户使用鼠标进行文本的选择、复制和粘贴操作,极大地提升了…
📅 2026/7/11 0:00:31
导语
先澄清一个常被混用的概念:BI试点"上线",并不等于试点"验收通过"。很多企业把仪表板做出来、账号发下去、培训开完场,就默认试点已经跑通,随后进入推广阶段——结果推广到第二个部门、第三个业务线时&am…
📅 2026/7/11 0:00:31
1. 项目背景与核心需求 在嵌入式系统开发中,快速精确的数据检索是一个常见但极具挑战性的需求。特别是在工业控制、医疗设备和物联网终端等场景下,系统往往需要在毫秒级时间内完成关键参数的读取和写入操作。传统基于Flash存储的方案存在擦写次数有限、操…
📅 2026/7/10 22:46:54
1. 工业电流环信号传输的基础认知在工业自动化领域,4-20mA电流环传输技术已经持续服役超过半个世纪。这种看似简单的信号传输方式之所以能经久不衰,核心在于其独特的抗干扰能力——电流信号在长距离传输时几乎不受线路电阻和电压波动的影响。我曾在化工厂…
📅 2026/7/10 22:46:54
最近在项目里尝试用 YOLO 做目标检测,从环境搭建到模型训练,再到推理部署,整个过程踩了不少坑。网上的资料虽然多,但要么版本老旧,要么步骤零散不成体系,对于刚入门的新手来说,很容易卡在某个环…
📅 2026/7/10 22:46:54
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/10 22:46:54
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/10 22:46:54
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/10 22:46:54