C语言小tip之函数递归

news2024/9/23 13:26:11

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.coloradmin.cn/o/2090588.html

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

相关文章

SCI英文期刊发表流程

目录 一、撰写初稿二、预审三、英文查重四、Cover letter和Highlights五、英文语法待续 一、撰写初稿 英文好的话应该直接写英文&#xff0c;因为中英文的写法不一样。 而且在这一步把格式修改好&#xff0c;初稿的最终版 二、预审 可以让同学、老师帮看论文&#xff0c;或者…

[Algorithm][综合训练][字符编码][最少的完全平方数][游游的字母串]详细讲解

目录 1.字符编码1.题目链接2.算法原理详解 && 代码实现 2.最少的完全平方数1.题目链接2.算法原理详解 && 代码实现 3.游游的字母串1.题目链接2.算法思路详解 && 代码实现 1.字符编码 1.题目链接 字符编码 2.算法原理详解 && 代码实现 解法&…

Carla自动驾驶仿真十:Carlaviz三维可视化平台搭建

文章目录 前言一、环境准备1、docker安装2、websocket-client安装3、carlaviz代码下载 二、carlaviz使用1、打开carla客户端2、输入启动命令3、进入carlaviz4、修改manual_control.py脚本5、运行manual_control.py脚本6、运行carlaviz官方脚本&#xff08;推荐&#xff09; 前言…

数据库之心:MySQL 探索(一)mysql的安装和基本介绍

欢迎来到我们的MySQL博客&#xff01;在这里&#xff0c;我们将深入探讨MySQL数据库系统的各个方面&#xff0c;包括基础知识、优化技巧、实践案例以及最新的行业趋势。 目录 前言 什么是数据库&#xff1f; 数据库产品 MySQL安装 解压 配置 添加环境变量 初始化MySQL …

计算机毕业设计PySpark+Scrapy高考推荐系统 高考志愿填报推荐系统 高考爬虫 协同过滤推荐算法 Vue.js Django Hadoop 大数据毕设

目  录 第1章 绪论 1.1 研究背景 1.2 国内外现状 1.2.1 国外研究现状 1.2.2 国内研究现状 1.3 主要研究内容 1.4 论文框架结构 第2章 相关开发技术与理论 2.1 前端技术 1&#xff0e;Vue框架技术 2&#xff0e;Element-Plus 2.2 后端技术 1&#xff0e…

linux下cpu多核运行程序以及运行时间统计

一、多核心运行程序 在linux下我们可以指定线程或者进程运行在指定的cpu核心上&#xff0c;操作方法如下&#xff1a; 1&#xff09;运行进程指定cpu核心 taskset -c 2 ./app //-c指定运行的cpu核心号&#xff0c;从0计数&#xff0c;查看效果如下&#xff1a; 2&#xff09…

C++map容器中operator[ ]的实现原理

目录 一、operator[ ]函数介绍 二、insert函数介绍 三、operator[ ]函数实现原理 四、operator[ ]函数功能 一、operator[ ]函数介绍 mapped_type& operator[] (const key_type& k);在map容器中存储的是一个键值对value_type&#xff0c;其本质是pair<const key…

maya python调试(pycharm)

maya里面调试代码一直用的print。遇到复杂点的类就感觉有点束手束脚的&#xff0c;因此整理了一下maya调试的一些方法 1.万能的pdb调试 pdb 有2种用法 1.非侵入式方法 &#xff08;不用额外修改源代码&#xff0c;在命令行下直接运行就能调试&#xff09; 常规用法&#xf…

APP长文本内容编辑器功能实现方案

背景 CSDN APP 中原有编辑器页面为纯H5适配&#xff0c;整体用户交互体验差&#xff0c;如何优化APP端编辑器用户体验是我们团队需要思考的问题。下面我们以iOS为例展开讨论。 一、方案调研 我们分析了几款国内内容发布的APP&#xff0c;如知乎、今日头条、简书&#xff0c;…

有了它 一键掌握Vue新版本!

声明&#xff1a;此篇为 ai123.cn 原创文章&#xff0c;转载请标明出处链接&#xff1a;https://ai123.cn/#1 你是否也在为Vue生态中的快速更新而焦头烂额&#xff1f;ue 3.4版本发布&#xff0c;带来模板解析器重写和响应系统重构&#xff0c;提升了性能和开发体验。测试框架如…

《深入理解JAVA虚拟机(第2版)》- 第3章 - 学习笔记

第3章 垃圾收集器与内存分配策略 3.1 概述 垃圾收集器要完成三件事情&#xff1a; 什么样的内存需要回收什么时候回收如何回收 垃圾收集器主要关注的区域是&#xff1a;Java堆和方法区。因为程序计数器、虚拟机栈、本地方法栈是线程私有的&#xff0c;随着线程的结束所使用的…

2d椭圆拟合学习

算法来自论文《 Direct Least Square Fitting of Ellipses》 《NUMERICALLY STABLE DIRECT LEAST SQUARES FITTING OF ELLIPSES》 相关文章 论文阅读&#xff1a;直接拟合椭圆 Direct Least Square Fitting of Ellipseshttps://zhuanlan.zhihu.com/p/645391510Fitting Elli…

rsyslog交叉编译

文章目录 1、依赖库列表2、编译建议3、编译3.1、编译libestr3.2、编译libfastjson3.3、编译zlib3.4、编译libuuid3.5、编译libgpg-error3.6、编译libgcrypt3.7、编译openssl3.8、编译curl3.9、编译rsyslog该文档描述了如何交叉编译rsyslog到arm64嵌入式平台。 1、依赖库列表 li…

UE5开发——射击武器类拾取

整体框架&#xff1a; 拾取武器 要在 Unreal Engine 5 (UE5) 中实现一个按 E 键拾取武器的功能&#xff0c;您可以遵循以下步骤&#xff1a; ### 步骤 1: 创建拾取物品的基础类 1. 在 Content Browser 中创建一个新的 C 类&#xff0c;继承自 AActor 或者 AStaticMeshActor。…

pytorch交叉熵损失函数

nn.CrossEntropyLoss 是 PyTorch 中非常常用的损失函数,特别适用于分类任务。它结合了 nn.LogSoftmax 和 nn.NLLLoss(负对数似然损失)的功能,可以直接处理未经过 softmax 的 logits 输出,计算预测值与真实标签之间的交叉熵损失。 1. 交叉熵损失的原理 交叉熵损失衡量的是…

Visual Studio Code离线汉化

从官网下载Visual Studio Code安装包后&#xff0c; 下载Visual Studio Code&#xff1a;https://code.visualstudio.com/ 若因网络等问题无法在线安装语言包&#xff0c;可以尝试离线安装&#xff1a; 从官网下载语言包&#xff1a; Extensions for Visual Studio family …

线上考试系统部署(thirty-six day)

一、线上考试系统的数据 虚拟化技术部署 1、部署前端服务器 &#xff08;1&#xff09;将资源上传到服务器 scp -r dist/ root192.168.1.11:~ &#xff08;2&#xff09;创建基础容器 在服务器上 systemctl start docker.servicedocker pull centosdocker run -it --name …

基于RAG多层次的多代理架构来处理时序任务

《Agentic Retrieval-Augmented Generation for Time Series Analysis》这篇文章提出了一种新颖的时间序列分析方法&#xff0c;称为Agentic Retrieval-Augmented Generation&#xff08;RAG&#xff09;框架。它通过多层次的多代理架构来处理时间序列任务&#xff0c;其中主代…

【银河麒麟高级服务器操作系统】soft lockup软锁实例详细记录分析及处理建议

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;https://product.kylinos.cn 开发者专区&#xff1a;https://developer.kylinos.cn 文档中心&#xff1a;https://documentkylinos.cn 现象描述 启nginx服务&#xff0c;但是报了sof…

WebRTC协议下的视频汇聚融合技术:EasyCVR视频技术构建高效视频交互体验

视频汇聚融合技术是指将来自不同源、不同格式、不同网络环境的视频流进行集中处理、整合和展示的技术。随着视频监控、远程会议、在线教育、直播娱乐等领域的快速发展&#xff0c;视频数据的规模急剧增长&#xff0c;对视频处理能力和效率提出了更高要求。视频汇聚融合技术通过…