函数(递归)

news2025/1/11 11:10:45

递归:程序调用自身编程技巧称为递归。

       在学习递归前需要粗略的了解一下内存,内存分为三类,分别是栈区、堆区和静态区。对于栈区来说,每调用一次函数都会为本次函数开辟一块空间,然而栈区也是有空间限制的,随即函数调用存在限制条件(当满足这个限制条件是递归便不再继续),且每次递归调用后越来越接近这个限制条件。超过这个限制会出现栈溢出的现象。

现在写一个简单的代码看一下栈溢出会出现怎么样的现象。

int main()
{
	printf("NX\n");
	main();
	return 0;
}

递归题目类型(既可以用递归也可以用非递归(简称迭代))

        1.打印一个数字的每一位且按照顺序。例:1024->1 0 2 4 ;

递归法

       递归是由里往外,先执行最里层的函数,函数执行完再逐渐返回调用的函数直至函数全部执行完返回到主函数里。这个题目就是不断地取余取模,一直重复这两个操作。它可以通过抹去尾位不断调用函数直至打印最高位,下面这个图演示了调用函数的过程:

 代码实现:

void print_digit(int n)
{
	if (n)
	{
		print_digit(n / 10);
		printf("%d ", n % 10);

	}
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	print_digit(n);
	return 0;
}

 迭代法

       这个方法需要抹去最高位数并打印出来,在这之前需要知道这个数的位数。接着对这个数进行相同位数取模、打印,取余减小位数为了打印下一位数字,这个相同位数在打印中不断变化(减小一位),然后就是重复之前的操作。

       举一次例子:通过计算得到1024是一个四位的数字,然后计算出就是相同位数1000,先取模1024/1000并打印数字1,最高位就打印好了,其次就是取余1024%1000=24将其值赋值给n,相同位数随即也要减小一位1000/10;然后就是while循环重复。

代码实现: 

int digit(int n)
{
	int count = 0;
	while (n)
	{
		n = n / 10;
		count++;
	}
	return count;
}

int main()
{
	int n = 0;
	scanf("%d", &n);
	int i = 0;
	int count = 0;
	int ret = 1;
	count = digit(n);//调用函数的原因是不改变n的值(利用形参不改变实参的值)
	for (i = 1; i < count; i++)
	{
		ret = ret * 10;//计算相同位数
	}
	while (n)
	{
		printf("%d ", n / ret);
		n = n % ret;//取余
		ret = ret / 10;//为了相同位数取模
	}
	return 0;
}
       2.实现n的k次方。例:2 3->8;

递归法

       限制条件是(k>0)满足调用函数,不满足返回1。下图展示:

代码实现: 

int factorial(int n, int k)
{
	if (k > 0)
	{
		return n * factorial(n, k - 1);
	}
	else
	{
		return 1;
	}
}

int main()
{
	int n = 0;
	int k = 0;
	scanf("%d %d", &n, &k);
	int sum = factorial(n, k);
	printf("%d\n", sum);
	return 0;
}

迭代法

       通过循环相乘有点类似累乘,代码也更少一点。代码实现:

int main()
{
	int n = 0;
	int k = 0;
	int i = 0;
	int num = 1;
	scanf("%d %d", &n, &k);
	for (i = 1; i <= k; i++)
	{
		num = num * n;//n的k次方
	}
	printf("%d\n", num);
	return 0;
}
       3.斐波那契数。例:1,1,2,3,5,8,13,......

递归法

       限制条件(n<3)。满足返回1,不满足调用函数直至返回一个数字。下面是第五个斐波那契数需要调用的斐波那契数,仔细看会发现有一些斐波那契数重复计算或调用(3,2,1),这大大增加计算的时间,假设需要计算一个很大很大的斐波那契数那重复计算的次数会更多,所以有时候并不是代码越简单越好,或任何场景使用递归都不是明智之举,需要具体问题具体分析。

代码实现: 

int fibonacci(int n)
{
	if (n < 3)
		return 1;
	else
		return fibonacci(n - 1) + fibonacci(n - 2);
}


int main()
{
	int n = 0;
	scanf("%d", &n);
	int ret = fibonacci(n);
	printf("%d\n", ret);
	return 0;
}

迭代法 

 简单明了的表明意图,循环直接算斐波那契前两项,通过不断复制避免重复计算。代码演示:

int main()
{
	int n = 0;
	int i = 0;
	int a = 1;
	int b = 1;
	long long c = 1;//考虑斐波那契数会是一个巨大的数
	scanf("%d", &n);
	while (n > 2)
	{
		c = a + b;
		a = b;
		b = c;
		n--;//循环条件
	}
	printf("%d\n", c);
	return 0;
}

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

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

相关文章

GCN知识总结

关键点&#xff1a; 1.理解图结构的形式 2.如何使用邻接矩阵实现其图结构形式 3.GCN卷积是如何实现节点特征更新的 核心公式&#xff1a; 特征提取&#xff1a; 处理好的x 代表节点特征&#xff0c;然后*权重&#xff0c;再*邻接。 A尖换元后&#xff1a; forward函数 传播规则…

基于SpringBoot+Vue的篮球竞赛预约平台(带1w+文档)

基于SpringBootVue的篮球竞赛预约平台(带1w文档) 基于SpringBootVue的篮球竞赛预约平台(带1w文档) 本系统提供给管理员对首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;项目分类管理&#xff0c;竞赛项目管理&#xff0c;赛事预约管理&#xff0c;系统管理等诸多功…

C++中的模板函数和模板类

模板是 C 中的泛型编程的基础&#xff0c;编写与类型无关的通用代码&#xff0c;是代码复用的一种手段。 作为强类型语言&#xff0c;C 要求所有变量都具有特定类型&#xff0c;由程序员显式声明或编译器推导。 但是&#xff0c;许多数据结构和算法无论在哪种类型上操作&#x…

【Java开发实训】day05——数组常见算法

目录 一、数组翻转 1.1示例代码 1.2适用场景 二、冒泡排序 2.1示例代码 2.2适用场景 三、二分查找 3.1示例代码 3.2适用场景 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo…

Elasticsearch中任务管理怎么做?

一个ES集群研发在清理数据时使用了delete_by_query&#xff0c;导致集群性能严重受影响&#xff0c;影响了正常的业务。为了快速恢复集群正常状态&#xff0c;考虑把还在进行的delete_by_query任务清除掉。 先查看当前集群的任务 GET _cat/tasks?v发现delete_by_query的任务…

Git笔记:(上传Git、Git获取文件版本、删除、统计)

目录 一、上传文件到github 1.1 配置用户名和邮箱 1.2 初始化本地仓库 1.3 添加项目目录下所有文件至本地仓库 1.4 使用如下命令加入注释提交 1.5 将本地仓库与远程仓库相连接 1.6 将本地仓库中的文件推送至指定的远程仓库中 二、git获取不同版本 2.1 git下载特定历史…

[MySQL]02 存储引擎与索引,锁机制,SQL优化

Mysql存储引擎 可插拔式存储引擎 索引是在存储引擎底层上实现的 inno DB MySQL默认存储引擎: inno DB高可靠性和高性能的存储引擎 DML操作遵循ACID模型支持事务行级锁,提高并发访问性能支持外键 约束,保证数据完整性和可靠性 MySAM MySAM是MySQL的早期引擎 特点: 不支持事…

【数据结构_C语言】归并排序—文件类型

文章目录 1.排序定义2. 代码实现 1.排序定义 内排序&#xff1a;数据量相对少一些&#xff0c;可以放到内存中排序。 外排序&#xff1a;数据量较大&#xff0c;内存中放不下&#xff0c;数据放到磁盘文件中&#xff0c;需要排序。 归并排序&#xff1a; 2. 代码实现 void…

基于CNN-BiLSTM的数据回归预测

代码原理 基于CNN-BiLSTM的数据回归预测是一种结合卷积神经网络&#xff08;CNN&#xff09;和双向长短期记忆网络&#xff08;BiLSTM&#xff09;的混合模型&#xff0c;用于处理和预测时间序列数据。以下是该方法的简单原理及流程&#xff1a; 原理 &#xff08;1&#xf…

OSGB整体或自定义区域转换为3DTiles

工具 OSGB源数据灵易智模倾斜摄影编辑平台(下称OPEditor) 操作步骤 打开倾斜摄影 打开软件&#xff08;登录即注册&#xff0c;直接用手机号登录&#xff09;使用OPEditor打开OSGB原始倾斜数据&#xff0c;将会看到如下页面 整体导出为3DTiles 在右侧节点树上鼠标右键点…

“为你写诗”,与ai“推敲”码字:第一次在严谨的csdn发布只有“思绪”没有代码的笔记(ai对话实录)

与ai“推敲”码字&#xff0c;第一次在严谨的csdn发布只有“思绪”没有代码的笔记(ai对话实录)。 (笔记模板由python脚本于2024年07月22日 21:13:08创建&#xff0c;本篇笔记适合本文无关代码&#xff0c;爱思考穷探究的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&…

力扣21-30题(数学的简单的结束和数组的前几道)

20240721 1.题和解析693. 交替位二进制数405. 数字转换为十六进制数171 excel 表序列号 从这之后的是数组了2011. 执行操作后的变量值1929. 数组串联1720. 解码异或后的数组异或解析&#xff1a;2574. 左右元素和的差值101. 对称二叉树LCP 06. 拿硬币1365. 有多少小于当前数字的…

org.springframework.context.ApplicationContext发送消息

1、创建消息的实体类 package com.demo;/*** 监听的实体类**/ public class EventMessage {private String name;public EventMessage(String name) {this.name name;}public String getName() {return name;}public void setName(String name) {this.name name;} }2、创建消…

three.js NDC空间转视图空间(getViewPosition)

three.js NDC空间转视图空间 NDC空间转视图空间, 比较常用。很多效果依赖于此。 包括: GTAOShaderReflectorForSSRPassSSRShader 下面看一下它的庐山真面目。 1、计算clipW 视图空间(view) 应用投影矩阵后转换到 剪裁空间(clip)。 [ A 0 B 0 0 C D 0 0 0 E F 0 0 − 1 0 ]…

Truenas scale 配置 Official Zerotier 并设置一直固定Zerotier IP

Zerotier 安装 TrueNAS Scale -> Apps -> Discover Apps -> 搜索 Zerotier 并安装Netwoek 中填入你 zerotier 网页中的的 Network IDAuto Token (API key) zerotier网页的 Account -> API Access Tokens -> New Tokenidentity.secret 和 identity.public 通过 …

国际化技术参考

一、概述 国际化就是用户可以选择对应的语言,页面展示成对应的语言; 一个系统的国际化按照信息的所在位置,可以分为三种国际化信息: 前端页面信息后端提示信息数据库的字典类信息二、前端页面国际化 使用i18n库实现国际化 i18n国际化库思路:通过jquery或者dom操作拿到需…

【动态规划】打家劫舍

动态规划的四个解题步骤&#xff1a; 1、定义子问题 2、写出子问题的递推关系 3、确定dp数组的计算顺序 4、空间优化&#xff08;可选&#xff09;上一篇博客学的有点杂乱&#xff0c;这一篇从解题步骤方面整理一下动态规划这一章。 打家劫舍&#xff08;难度&#xff1a;中等…

C++进阶中继承的全部主要内容

小编在学习完C中继承的内容之后&#xff0c;觉得继承的内容很重要&#xff0c;所以今天给大家带来的内容就是继承的主要内容&#xff0c;今天的内容包括继承的定义与语法&#xff0c;继承方式与权限&#xff0c;基类和派生类的类型转换赋值&#xff0c;继承中的隐藏&#xff0c…

数据跨境法案:美国篇下

数据跨境法案美国篇下主要介绍2018年《出口管制改革法案》(ECRA)、2018 年《外国投资风险审查现代化法案》(FIRRMA) 和《强化海外关键出口国家框架法》&#xff08;ENFORCE&#xff09;。其中 ECRA法案和 FIRRM 法案作为2019财年约翰S麦凯恩国家国防授权法&#xff08;NDAA&…

MySQL定时备份数据,并上传到oss

1.环境准备 1.安装阿里云的ossutil 2.安装mysql 2.编写脚本 脚本内容如下 #!/bin/bash # 数据库的配置信息&#xff0c;根据自己的情况进行填写 db_hostlocalhost db_usernameroot db_passwordroot db_namedb_root # oss 存贮数据的bucket地址 bucket_namerbsy-backup-buck…