C语言 --- 函数递归

函数递归

  • 一、什么是函数递归
  • 二、函数递归的要点
  • 三、示例
    • 1.计算n的阶乘
    • 2.提取一个任意正整数的所有位数,按顺序排列
    • 3.获取第n个斐波那契数,最开始的两个数是1,1
  • 四、总结

一、什么是函数递归

函数递归是一种解决问题的思想,是将一个大的问题化为一个一个小的问题(类似于剥洋葱),是在一个函数体内部自己调用自己的方法。递归就是递推加回归,是基于函数实现的。
例如:

// 第一个最简单的函数递归程序:int main()
{printf("hahaha\n");main();       // 在main函数体内再次调用自己,这就是递归return 0;
}

运行结果:

在这里插入图片描述

但是这是一个问题程序,因为没有临界条件,所以会死递归下去,最终导致出现上图中栈溢出(Stack overflow)。
因为每一次函数递归都会创建函数栈帧,此栈帧创建在内存的栈区,最终死递归,栈区空间消耗完毕,出现栈溢出的问题。

二、函数递归的要点

基于点一,函数递归有以下两个要点:

1. 函数递归要有临界条件,每次递归后都要逼近此条件,否则会出现死递归的情况,到达临界条件,将不再函数调用
2. 并不是所有的程序都能写成函数递归形式,并且就算是能写成函数递归的形式,在函数递归调用过程中会创建函数栈帧,产生运行时的开销(空间,时间),空间可能出现栈溢出的问题,时间影响运行效率,所以在某些程序中迭代(循环)和递归形式都能实现,并且递归实现代码比迭代实现更加复杂,那么还是使用迭代实现。

三、示例

1.计算n的阶乘

实现思路:
在这里插入图片描述

// 示例1:设计一个程序,计算n的阶乘
int func(int n)
{if (n == 0)return 1;elsereturn func(n - 1) * n;
}int main()
{// 计算n的阶乘int n = 0;scanf("%d", &n);int ret = func(n);printf("%d\n", ret);return 0;
}

递归过程:
在这里插入图片描述

2.提取一个任意正整数的所有位数,按顺序排列

实现思路:
在这里插入图片描述

// 示例2:设计一个程序,提取一个任意正整数的所有位数,按顺序排列
void func(int m)
{// 当m为一位数时,直接提取自身if (m >= 0 && m <= 9)printf("%d ", m % 10);else{func(m / 10);printf("%d ", m % 10);}
}int main()
{int m = 0;scanf("%d", &m);func(m);return 0;
}

递归过程:
在这里插入图片描述

3.获取第n个斐波那契数,最开始的两个数是1,1

实现思路:
在这里插入图片描述

// 示例3:设计一个程序,获取第n个斐波那契数,最开始的两个数是1,1
int fib(int n)
{if (n == 1 || n == 2){return 1;}else{return fib(n - 1) + fib(n - 2);}
}int main()
{int n = 0;scanf("%d", &n);int ret = fib(n);printf("%d\n", ret);return 0;
}

这里直接说出结果,这是一个有问题的递归程序,当n很大很大的时候,上述代码执行效率非常低下,因为:
在这里插入图片描述
所以这就是一个逻辑思维上运用递归的思想,但是递归实现出来有些许问题,正确的思路:
定文三个变量,a,b,c,让a等于0位置上的数据,b等于1位置上的数据,c等中于a加上b的数据,c就是我们所求的第n个斐波那契数。之后再先让b的值赋值给给a,c的值赋值给给b,循环下去,直到n>2才结束。最后返回c。

int fib(int n) {// 定义三个变量,a,b,c// a是第一个数字1,b是第二个数字1// c是我们所需要的第n个斐波那契数int a=1, b=1,c;// 当所求斐波那契数是前两个的时候,直接给定值即可if(n == 1 && n == 2)c=a;      // 此时斐波那契数就是1// 当所求斐波那契数是从第三个开始时while(n > 2){c = a + b;// 更新数据,注意别出现数据覆盖的情况a = b;b = c;n--; }// 返回斐波那契数return c;}

四、总结

上述的递归演示,第一个main函数内部再次调用自己导致出现栈溢出的错误是因为没有设定临界条件;前两个示例演示了如何分析一个程序如何变成递归思想,并且理清它的递归调用关系;最后一个示例就演示了在某写可以写成递归的程序,但是递归的实现有问题的这种程序,建议是使用迭代的思想去实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/89062.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/89062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GitHub 趋势日报 (2025年07月14日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图1916claude-code795the-book-of-secret-knowledge728free-for-dev547markitdown367…

PyTorch中张量(TensorFlow)操作方法和属性汇总详解和代码示例

1、张量的操作汇总 下面是 PyTorch 中常见的 张量操作方法汇总&#xff0c;包括 创建、索引、变换、数学运算、广播机制、维度操作 等内容&#xff0c;并附上详解和代码示例&#xff0c;便于系统学习与实战参考。一、张量创建&#xff08;torch.tensor 等&#xff09; import t…

统一日志格式规范与 Filebeat+Logstash 实践落地

背景 在多部门、多技术栈并存的企业环境中&#xff0c;日志收集与分析是保障系统稳定运行的核心能力之一。然而&#xff0c;不同开发团队采用各异的日志打印方式&#xff0c;导致日志数据结构混乱&#xff0c;严重影响后续的收集、存储、检索与告警效率。 比如我们大部门就有多…

【鸿蒙HarmonyOS】鸿蒙app开发入门到实战教程(三):实现一个音乐列表的页面

鸿蒙里面&#xff0c;实现一个音乐播放的列表,模拟数组的数据展示 实现效果代码实现 准备数据 songs:SongItemTypes[] [{img:https://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/0.jpg,name:直到世界的尽头,author:WANDS},{img:https://yjy-teach-oss.oss-cn…

2025年渗透测试面试题总结-2025年HW(护网面试) 47(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 2025年HW(护网面试) 47 1. UDF提权 2. 命令执行与代码执行的区别 3. 文件包含利用姿势 4. 漏洞复现流程 …

iPhone 数据擦除软件评测(最新且全面)

当您准备出售、捐赠或回收 iPhone 时&#xff0c;仅仅恢复出厂设置并不足以保证您的个人数据彻底消失。专业的 iPhone 数据擦除软件采用先进的技术&#xff0c;确保您的敏感信息永久无法恢复。本文回顾了十种流行的 iPhone 数据擦除工具&#xff0c;详细介绍了它们的功能、优点…

Qt 将触摸事件转换为鼠标事件(Qt4和Qt5及以上版本)

在Qt中&#xff0c;触摸事件&#xff08;QTouchEvent&#xff09;和鼠标事件&#xff08;QMouseEvent&#xff09;是两种不同的输入事件类型。通常情况下&#xff0c;触摸事件不会自动转换为鼠标事件&#xff0c;因为它们代表的是不同的输入设备&#xff08;触摸屏 vs 鼠标&…

Blender 云渲染高效流程:渲染 101 集群加速实战​

一、核心优势&#xff1a;适配 Blender 全场景需求​ ✅ 全渲染器深度兼容​ Cycles&#xff08;CPU/GPU 模式&#xff09;&#xff1a;云端 4090 显卡渲染速度比本地快 12 倍&#xff0c;支持 8K 分辨率 16K 纹理无压力​ Eevee 实时渲染&#xff1a;集群同步输出预览动画&am…

SQL学习记录01

什么是SQL&#xff1f; Structured Query Language &#xff08;结构化查询语言&#xff09;&#xff0c;与关系型数据库进行通信的标准语言。什么是数据库&#xff1f;“按照数据结构来组织、存储、和管理数据的仓库。”一个长期存储在计算机内的、有组织的、可共享的、统一管…

医疗项目如何应对法规变更?

医疗项目应对法规变更的关键策略包括建立法规监测体系、及时内部培训和沟通、调整业务流程和合规标准、技术系统快速迭代升级。 其中&#xff0c;建立有效的法规监测体系尤其重要。这意味着企业需要实时关注监管机构发布的政策更新和公告&#xff0c;迅速理解法规变化内容及对自…

AI Top10

AI 前十排名排名团队/机构名称国家核心优势领域1DeepMind英国强化学习、Alpha系列模型2OpenAI美国GPT系列、多模态大模型3DeepSeek中国高效NLP模型、开源生态建设4Google Brain美国Transformer架构、TensorFlow框架5Meta AI (FAIR)美国计算机视觉、Llama系列模型6NVIDIA Resear…

LabVIEW通知器函数应用

介绍LabVIEW通知器&#xff08;Notifier&#xff09;函数&#xff0c;演示两类并行循环通信场景&#xff1a;单对循环数据交互、多循环通知聚合&#xff0c;含程序框图&#xff08;数据发送 / 接收、多循环通知&#xff09;与前面板&#xff08;数据显示&#xff09;。功能说明…

推荐《Python 编程:从入门到实践》之Python编程的基础知识

在 Python 学习资源琳琅满目的当下&#xff0c;《Python 编程&#xff1a;从入门到实践》脱颖而出&#xff0c;堪称 Python 入门的不二之选。本书由经验丰富的教育工作者撰写&#xff0c;以清晰易懂的语言和循序渐进的方式&#xff0c;引领读者从 Python 的基础语法逐步迈向实际…

Kafka入门和基础配置

目录Kafka入门消息引擎系统ABC快速搞定Kafka术语kafka三层消息架构名词术语Kafka基础Kafka部署参考重要配置参数Broker端参数Topic级别参数JVM参数Kafka是消息引擎系统&#xff0c;也是分布式流处理平台Kafka入门 消息引擎系统ABC 民间版&#xff1a;系统 A 发送消息给消息引…

OPENPPP2 VEthernet 网络协议堆栈(CTCP)VNetStack 深度技术解析

&#x1f310; OPENPPP2 VEthernet 网络协议堆栈&#xff08;CTCP&#xff09;VNetStack 深度技术解析&#x1f3d7;️ 一、系统架构全景图 #mermaid-svg-FdlbKZCGQDDbvOL6 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermai…

Gartner发布2025年中国网络安全成熟度曲线:网络安全的重点正转向保护AI、推动业务转型和增强组织韧性

网络安全的重点正转向保护人工智能、推动业务转型和增强组织韧性。首席信息官及其安全和风险管理主管可以利用这份技术成熟度曲线来识别实用且高价值的技术和实践&#xff0c;从而保持安全和敏捷。 战略规划假设 到2027年&#xff0c;60%的中国大型组织将在安全运营中心&#x…

网络准入控制系统的作用解析,2025年保障企业入网安全第一道防线

在当今数字化时代&#xff0c;网络已成为企业运营的基础&#xff0c;随着网络的广泛应用&#xff0c;网络准入控制系统作为保障网络安全的重要手段&#xff0c;正发挥着至关重要的作用。保障网络安全网络准入控制系统如同网络的忠诚卫士&#xff0c;它为网络大门安装了智能锁&a…

java基础(day09)

目录 1.继承的作用 2.继承树 3.protected和super protected super 注&#xff1a;super/this()--构造方法&#xff0c;第一行&#xff0c;一般不同时出现 4.向上向下转型 向上转型 向下转型 final 小结 1.继承的作用 理解&#xff1a;首先就是可以实现代码复用&#x…

如何进行选择。

初始理解问题 首先&#xff0c;我们需要明确题目在问什么。题目“House Robber”描述的是一个强盗在一排房屋前&#xff0c;每个房屋都有一定数量的钱。强盗不能连续抢劫两个相邻的房屋&#xff0c;否则会触发警报。目标是抢劫到最多的钱。 动态规划的思路 这个问题可以使用动态…

PHP语法高级篇(三):Cookie与会话

Cookie与会话在 Web 编程中十分实用&#xff1a;Cookie 能实现一周免登录&#xff0c;还能记住用户的主题偏好&#xff1b;会话可保存当前用户信息&#xff0c;也能临时存储购物车数据。本篇文章将记录Cookie与会话的学习过程。 一、Cookie cookie 常用于识别用户。cookie 是服…