C语言学习笔记(五):函数递归
目录1. 什么是递归2. 递归的核心要素3. 递归经典案例3.1 求n的阶乘3.2 顺序打印一个整数的每一位4. 递归的问题与优化4.1 栈溢出风险5. 递归与循环的选择1. 什么是递归递归是一种编程技术指的是一个函数在其定义内部调用自身。最简单的递归程序虽然是错误的#includestdio.hintmain(){printf(hehe\n);main();// main函数自己调用自己return0;}这个程序会一直打印hehe直到程序崩溃。因为它是死递归没有终止条件最终会导致栈溢出。生活类比俄罗斯套娃打开一个大娃娃里面还有一个小娃娃再打开还有更小的……镜子中的镜子两面镜子对着照里面会出现无数层影像递归的核心思想就是把一个大型复杂问题层层转化为一个与原问题相似、但规模较小的子问题来求解直到子问题不能再拆分递归就结束了大事化小。2. 递归的核心要素一个正确的递归函数必须包含两个关键部分终止条件基础情况不再进行递归调用、能直接返回结果的特定条件。没有它递归会无限进行下去最终导致栈溢出。递归调用递推阶段函数自己调用自己每次调用时问题的规模都要比上一次更小逐步逼近终止条件。3. 递归经典案例3.1 求n的阶乘题目计算正整数 n 的阶乘0! 1不考虑溢出数学公式当 n 0 时0! 1当 n 0 时n! n × (n-1)!代码实现#includestdio.hintFact(intn){if(n0)return1;// 终止条件elsereturnn*Fact(n-1);// 递归调用规模变小}intmain(){intn0;scanf(%d,n);intretFact(n);printf(%d\n,ret);return0;}执行过程以 n5 为例Fact(5) 5 * Fact(4) 5 * 4 * Fact(3) 5 * 4 * 3 * Fact(2) 5 * 4 * 3 * 2 * Fact(1) 5 * 4 * 3 * 2 * 1 * Fact(0) 5 * 4 * 3 * 2 * 1 * 1 120递归写法 vs 循环写法递归写法intFact(intn){if(n0)return1;elsereturnn*Fact(n-1);}循环写法intFact(intn){intret1;for(inti1;in;i){ret*i;}returnret;}3.2 顺序打印一个整数的每一位题目输入一个正整数按顺序打印它的每一位数字。输入1234 → 输出1 2 3 4输入520 → 输出5 2 0思路分析一个数的最低位最容易得到1234 % 10 4去掉最低位1234 / 10 123把问题拆解为先打印前面所有位再打印最后一位当数字变成一位数时直接打印不再拆分代码实现#includestdio.hvoidPrint(intn){if(n9)// 如果不是一位数{Print(n/10);// 先递归打印前面所有位}printf(%d ,n%10);// 再打印最后一位}intmain(){intm0;scanf(%d,m);Print(m);return0;}执行过程以 1234 为例Print(1234) → Print(123) → Print(12) → Print(1) → printf(1) → printf(2) → printf(3) → printf(4) 输出结果1 2 3 44. 递归的问题与优化4.1 栈溢出风险每次函数调用都需要在内存的栈区申请一块空间称为栈帧来保存局部变量和函数调用信息。如果递归层次太深栈空间会被耗尽导致栈溢出。#includestdio.hintcount0;voidtest(){count;printf(当前递归深度%d\n,count);intbuffer[1000]{0};// 占用栈空间test();// 无限递归}intmain(){test();return0;}运行到一定深度后程序会崩溃因为栈空间被耗尽了。5. 递归与循环的选择很多递归问题都可以改写成循环版本循环通常效率更高。求阶乘对比递归写法intFact(intn){if(n0)return1;elsereturnn*Fact(n-1);}循环写法intFact(intn){intret1;for(inti1;in;i){ret*i;}returnret;}选择建议递归的优点是代码简洁、思路清晰适合树/图遍历、分治算法、回溯算法等场景循环的优点是效率高没有栈溢出风险一般建议递归深度 100 层且没有大量重复计算时可以放心使用递归如果递归存在明显性能问题改成循环版本总结递归就是函数自己调用自己记住两点终止条件和递归调用。终止条件让递归停下来递归调用让问题规模不断变小。递归能让代码变得很简洁但要注意栈溢出风险深度超过100层时建议改成循环。

相关新闻

GetQzonehistory:一键永久备份QQ空间青春记忆的终极解决方案

GetQzonehistory:一键永久备份QQ空间青春记忆的终极解决方案

GetQzonehistory:一键永久备份QQ空间青春记忆的终极解决方案 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 在数字时代,我们的青春记忆越来越多地存储在社交平台…

2026/9/13 20:36:32 阅读更多 →
喷砂抛光定制厂家,选对品质才可靠

喷砂抛光定制厂家,选对品质才可靠

在高端制造业快速迭代的今天,表面处理工艺已成为决定产品质感与耐用性的关键环节。喷砂,作为一项基础却至关重要的表面处理技术,广泛应用于精密零部件加工领域。然而,面对市场上良莠不齐的加工服务商,如何选对一家品质…

2026/10/1 12:29:51 阅读更多 →
三步搞定脑网络分析:不用写代码也能做专业研究

三步搞定脑网络分析:不用写代码也能做专业研究

三步搞定脑网络分析:不用写代码也能做专业研究 【免费下载链接】GRETNA A Graph-theoretical Network Analysis Toolkit in MATLAB 项目地址: https://gitcode.com/gh_mirrors/gr/GRETNA 还在为复杂的脑网络分析而头疼吗?想研究大脑连接奥秘却被编…

2026/10/1 9:29:18 阅读更多 →

最新新闻

Paperxie 外文文献翻译模块|搞定英文文献阅读,不再被专业术语卡脖子

Paperxie 外文文献翻译模块|搞定英文文献阅读,不再被专业术语卡脖子

前言 写毕业论文,外文文献阅读是绕不开的一关。不管是本科还是硕士,在梳理国内外研究现状、撰写文献综述时,都需要大量阅读英文文献。很多同学第一反应就是打开普通翻译网站,可翻译出来的结果经常出现专业名词错乱、长难句逻辑断…

2026/10/1 14:42:56 阅读更多 →
从Node-RED到自研Go规则引擎:基于DMN的决策管理实践

从Node-RED到自研Go规则引擎:基于DMN的决策管理实践

1. 写在前面:我为什么要放下 Node-RED做规则引擎这个事,起因很朴素:我们团队在风控与活动营销场景里,用 Node-RED 当了两年"规则系统",最后终于被逼到非换不可的地步。Node-RED 作为流编排工具确实好用&…

2026/10/1 14:42:56 阅读更多 →
西门子PLC高危漏洞频发,一线工程师教你如何构建工控安全防线

西门子PLC高危漏洞频发,一线工程师教你如何构建工控安全防线

1. 工控圈又炸锅了:这次轮到西门子PLC做自动化这行的朋友,最近应该都刷到过那条消息——西门子部分型号PLC被曝出高危漏洞。我第一时间看到的时候,正在车间里调试一条包装线,手机弹窗跳出来,心里咯噔一下。干这行十几年…

2026/10/1 14:42:56 阅读更多 →
比ChatGPT还贵,TaoToken视角拆解Manus订阅积分收费逻辑

比ChatGPT还贵,TaoToken视角拆解Manus订阅积分收费逻辑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 14:42:56 阅读更多 →
Python实战:从零构建古诗生成器,LSTM模型训练与Flask接口集成

Python实战:从零构建古诗生成器,LSTM模型训练与Flask接口集成

简介:这是一份面向文学爱好者、编程学习者与AI爱好者的Python古诗生成器完整源码,将后端算法与前端界面融合,帮助读者在体验古诗创作的同时理解自然语言处理与网页设计的结合方式。压缩包共43个文件、约10.85MB,包含7个Python脚本…

2026/10/1 14:42:56 阅读更多 →
Docker部署cocoindex-code完全教程:免Python、免装依赖的持久容器方案

Docker部署cocoindex-code完全教程:免Python、免装依赖的持久容器方案

Docker部署cocoindex-code完全教程:免Python、免装依赖的持久容器方案 【免费下载链接】cocoindex-code A super light-weight embedded code search engine CLI (AST based) that just works - improves speed and efficiency for coding agent 🌟 Star…

2026/10/1 14:41:56 阅读更多 →

日新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/30 13:14:22 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 18:13:06 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →