C语言小tip之函数递归

hello,各位小伙伴们今天我们来学习一下函数递归。

什么是函数递归呢?简单来说就是函数自己来调用自己。函数递归的主要思想是把大事化小,递归包含两层方面:1、递推   2、回归

在使用函数递归的时候要注意包含两个限制条件:1、递归存在限制条件,当满足这个限制条件时,递归不在继续进行    2、函数在递归的时候要不断接近这个限制条件

练习:求n的阶乘

#include<stdio.h>
//n的阶乘
int Fact(int n)
{if (n == 0)return 1;else{return n * Fact(n - 1);}
}
int main()
{int n = 0;scanf("%d", &n);int ret = Fact(n);printf("%d\n", ret);return 0;
}

 让我们画图来演示一下!

 顺序打印一个整数中的每一位

例如1234,我们要输出1 2 3 4 ,可以将1234%10得到4,然后在1234/10得到123,在不断重复上述操作,就可以得到4 3 2 1,但这些是逆序打印的!

如果使用递归的话,在回归的时候会顺序打印!

 

 代码实现:

#include<stdio.h>
void Function(int n)
{if (n / 10 != 0){Function(n / 10);}printf("%d ", n % 10);
}int main()
{int n = 0;scanf("%d", &n);Function(n);return 0;
}

如果小伙伴仍然难以理解,我们可以试试这样:n=2345

当然代码是只有一份的,在进行函数调用的时候会在栈区申请一段空间,用来保存函数在调用期间各种局部变量,这段空间叫做运行时栈或者函数栈帧。

当了解到函数的调用是在栈区申请空间时,我们就应该注意到函数调用次数不宜过多,否则就会造成栈溢出!

求斐波那契数:

 如果使用函数递归的话,我们应该会这样写:

#include<stdio.h>
int Fib(int n)
{if (n <= 2){return 1;}else{return Fib(n - 1) + Fib(n - 2);}
}
int main()
{int n = 0;scanf("%d", &n);int r = Fib(n);printf("%d", r);return 0;
}

 但这样会造成一个极易忽略的问题:栈溢出!当我们输入50的时候计算机会等1分钟左右才会输出答案,它在疯狂的计算!同时我们打开任务管理器后会发现它几乎占据很大比例的CPU。

 由此可以看出并不是使用函数递归就是最好的办法!

如果加上计数器在计算第40位数时候次数非常大!

迭代

#include<stdio.h>
int Fib(int n)
{int i = 0;int a = 1;int b = 1;int c = 0;for (i = 0; i < n - 2; i++){c = a + b;a = b;b = c;}return c;
}
int main()
{int n = 0;scanf("%d", &n);int r = Fib(n);printf("%d", r);return 0;
}

虽然没有使用递归但计算上简洁不少!所以并不是所有都要使用递归。

这期C语言小tip就到这里啦,拜拜。

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

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

相关文章

Linux 软硬连接

1. 硬链接 实际上并不是通过文件名来找到磁盘上的文件&#xff0c;而是通过inode。在linux中可以让多个文件名对应于同一个 inode&#xff0c;而这种方式就是建立硬链接。硬链接是文件系统中的一种链接类型&#xff0c;它创建了文件的一个额外的目录项&#xff0c;但不占用额外…

全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用

SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型&#xff0c;它综合考虑了土壤-水分-大气以及植被间的相互作用&#xff1b;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程&#xff0c;使其能够精确的模拟土壤中水分的运动&#xff0c;而且耦合了W…

EmguCV学习笔记 C# 7.1 角点检测

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

Ubuntu22.04安装 docker和docker-compose环境

Docker简介 Docker 是一个开源的应用容器引擎&#xff0c;它使开发者能够打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不会有任何接口&#xff08;…

蓝色炫酷碎粒子HTML5导航源码

源码介绍 蓝色炫酷碎粒子HTML5导航源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 效果预览 源码获取 蓝色炫酷碎粒…

Halcon提取边缘线段lines_gauss 算子

Halcon提取边缘线段lines_gauss 算子 edges_color_sub_pix和edges_sub_pix两个算子使用边缘滤波器进行边缘检测。还有一个常用的算子lines_gauss算子&#xff0c;也可以用于提取边缘线段&#xff0c;它的鲁棒性非常好&#xff0c;提取出的线段类型是亚像素精度的XLD轮廓。其原…

LLM训练、精调与加速:大型语言模型的高效开发与应用策略

创作不易&#xff0c;您的关注、点赞、收藏和转发是我坚持下去的动力&#xff01; 大家有技术交流指导、论文及技术文档写作指导、项目开发合作的需求可以私信联系我 LLM&#xff08;大型语言模型&#xff09;的训练、精调和加速是当前人工智能研究和应用中的重要话题。下面将…

JVM垃圾判定算法

垃圾收集技术是Java的一堵高墙。Java堆内存中存放着几乎所有的对象实例&#xff0c;垃圾收集器在对堆内存进行回收前&#xff0c;第一件事情就是要确定这些对象中哪些还存活&#xff0c;哪些已经死去&#xff08;即不可能再被任何途径使用的对象&#xff09;。也就是判定垃圾。…

【学习笔记】卫星通信NTN 3GPP标准化进展分析(五)- 3GPP Release19 研究计划

一、引言&#xff1a; 本文来自3GPP Joern Krause, 3GPP MCC (May 14,2024) Non-Terrestrial Networks (NTN) (3gpp.org) 本文总结了NTN标准化进程以及后续的研究计划&#xff0c;是学习NTN协议的入门。 【学习笔记】卫星通信NTN 3GPP标准化进展分析&#xff08;一&#xff…

第二证券:大洗牌!头部券商营收、净利集体下滑

前十券商营收团体下滑&#xff0c;银河证券跌幅最小 新股IPO数量锐减129家至44家&#xff0c;国内证券市场股票基金交易量日均规划 同比下降 6.83%……关于证券公司而言&#xff0c;本年上半年可谓多重要素叠加冲击&#xff0c;成果下滑难以避免。于大多数证券公司而言&#x…

Vue(三)内置指令v-text、html、cloak、once、pre;自定义指令的三种方式、Vue生命周期

文章目录 1. 内置指令1.1 v-text、v-html指令1.2 v-cloak指令1.3 v-once指令1.4 v-pre指令 2. 自定义指令(directives)2.1 函数式2.2 对象式2.3 注意点 3. 生命周期3.1 挂载流程3.2 更新流程3.3 销毁流程 1. 内置指令 1.1 v-text、v-html指令 v-text与v-html都是向所在的节点…

EPLAN中部件库的导入和使用方法

EPLAN中部件库的导入和使用方法 如下图所示,点击工具-----部件------管理, 在弹出的窗口中点击附加------导入, 找到自己需要导入的文件,后缀名为EDZ,点击打开, 如下图所示,勾选"更新已有数据集并添加新建数据集",点击确定, 如下图所示,正在导

为什么一些行业刚起步就白热化竞争-例如机器人行业?

部分从事机器人行业的从业者交流就是特别卷。 明明是一个刚起飞的行业为何竞争如此残酷&#xff1f; 抛开降本增效的商业逻辑不谈。 只从一个侧面去观察-供需。 从事脑力劳动的机器人-处理文档 从事体力劳动的机器人-打螺丝 交流 机器人时代什么时候到来&#xff1f; 相似…

编译器基础介绍

随着深度学习的不断发展&#xff0c;AI 模型结构在快速演化&#xff0c;底层计算硬件技术更是层出不穷&#xff0c;对于广大开发者来说不仅要考虑如何在复杂多变的场景下有效的将算力发挥出来&#xff0c;还要应对 AI 框架的持续迭代。AI 编译器就成了应对以上问题广受关注的技…

论文翻译:Scaling Instruction-Finetuned Language Models

Scaling Instruction-Finetuned Language Models https://www.jmlr.org/papers/volume25/23-0870/23-0870.pdf 指令微调语言模型 文章目录 指令微调语言模型摘要1. 引言2. Flan微调2.1 微调数据2.2 微调过程2.3 评估协议 3. 扩展到5400亿参数和1836个任务4. 带有思维链注释的微…

HMI触屏网关-VISION如何与Modbus TCP从机通信

上文&#xff1a;HMI触屏网关-VISION如何与Modbus RTU从机通信-CSDN博客 1. 硬件连接 Modbus TCP协议采用网口通信的方式&#xff0c;因此&#xff0c;只需要保证网关的LAN口IP和Modbus TCP从机的IP在同一网段即可。 Modbus TCP从机参数说明&#xff1a; 2. VISION创建Modbu…

LaViT:这也行,微软提出直接用上一层的注意力权重生成当前层的注意力权重 | CVPR 2024

Less-Attention Vision Transformer利用了在多头自注意力&#xff08;MHSA&#xff09;块中计算的依赖关系&#xff0c;通过重复使用先前MSA块的注意力来绕过注意力计算&#xff0c;还额外增加了一个简单的保持对角性的损失函数&#xff0c;旨在促进注意力矩阵在表示标记之间关…

从0到1搭建用户管理系统

手把手教你搭建前后端框架 新手对于很多成熟框架&#xff0c;不知道如何搭建的&#xff0c;不知道如何实现等等&#xff0c;忙碌之余&#xff0c;写了一篇博客 手把手教你搭建前后端框架源码&#xff0c; springbootmysqlelementuivue 从0到1&#xff0c;搭建springboot框架&am…

出租车4G5G无线车载监控系统解决方案(下)

目录 一、项目概述 1.1 项目背景 1.2 设计原则 1.3 设计目标 1.4 实施意义 二、系统总体设计 2.1建设目标 2.2系统模式 2.3设计思路 2.4设计架构 2.5系统组成 2.6优势分析 2.7设备达到的功能要求 2.8系统组成 三、系统详细设计 3.1 出租车车载监控 3.1.1 系统功能设计 3.2系统前…

如何在退出Qt时保存用户配置

如何在退出Qt时保存用户配置 文章目录 如何在退出Qt时保存用户配置一、简介二、 保存配置数据&#xff08;方法一&#xff09;2.1 项目实现2.2 运行结果 三、保存配置数据&#xff08;方法二&#xff09;3.1 项目实现3.2 运行结果 四、写在最后 ​ 一、简介 在我们使用 Qt 进行…