C语言进阶版第五课—函数递归

news2024/11/15 4:52:16

文章目录

  • 1. 什么是函数递归
  • 2. 函数递归的思想
  • 3. 函数递归的限制
  • 4. 函数递归练习
    • 4.1 n的阶乘
    • 4.2 按照顺序打印一个整数的每一位
    • 4.3 自定义函数不允许创建变量,求字符串长度

1. 什么是函数递归

  • 函数递归就是函数自己调用自己

在这里插入图片描述
  图片中的函数test()就是函数递归的一个体现,在其内部调用自己

2. 函数递归的思想

  • 函数递归的思想就是将大事化小,用最简单的代码完成重复性的工作

3. 函数递归的限制

  • 函数递归时是有限制条件的,满足限制条件时,递归便停止
  • 函数每次递归时都会越来越接近限制条件
//函数递归
//斐波那契数(前两个数之和等于第三个数)
//1 1 2 3 5 8 13 21 34 55 ……
#include <stdio.h>
int test(int n)
{
	if (n <= 2)
		return 1;
	else
		return test(n - 1) + test(n - 2);
}
int main()
{
	int n = 0;  //斐波那契第n个数
	printf("请输入你想要的斐波那契第几位数>:");
	scanf("%d", &n);
	int num = test(n);
	printf("斐波那契第%d数是%d\n",n,num);
	return 0;
}

  就像这段代码中的n <= 2的条件.

4. 函数递归练习

4.1 n的阶乘

  • 正常打印n的阶乘
//打印n的阶乘
#include <stdio.h>
int main()
{
	int n = 0;
	int ret = 1;
	printf("请输入你想输出哪个数的阶乘>:");
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
	{
		ret *= i;
	}
	printf("%d的阶乘为%d\n", n, ret);
	return 0;
}

在这里插入图片描述

  • 递归实现
//用递归实现n的阶乘
//1*2*3*4*5……n
#include <stdio.h>
int test(int n)
{
	if (n == 1)
		return 1;
	else
		return n * test(n - 1);
}
int main()
{
	int n = 0;
	printf("请输入你想输出哪个数的阶乘>:");
	scanf("%d", &n);
	int num = test(n);
	printf("%d的阶乘为%d\n", n, num);
	return 0;
}

在这里插入图片描述

4.2 按照顺序打印一个整数的每一位

  • 例如,输入:1234,输出:1 2 3 4
  • 分析一下,首先我们可以通过1234 / 10得到123,通过1234 % 10得到余数4
  • 然后我们把123 / 10得到12,把123 % 10 得到余数3
  • 然后我们把12 / 10得到1,把12 % 10 得到余数2
  • 最后1 % 10 得到余数1
  • 最后我们倒序打印余数即可,使用递归可按顺序1 2 3 4输出
//顺序打印整数的每一位
#include <stdio.h>
void print(int n)
{
	if (n > 9)
		print(n / 10);
	printf("%d ", n % 10);
}
//void print(int n)
//{
//	if (n < 10)
//		printf("%d ", n % 10);
//	else
//	{
//		print(n / 10);
//		printf("%d ", n % 10);
//	}
//}
int main()
{
	int n = 0;
	printf("请输入你想打印的整数>:");
	scanf("%d", &n);
	print(n);
	return 0;
}

在这里插入图片描述
在这里插入图片描述

4.3 自定义函数不允许创建变量,求字符串长度

  • 常规思路
#include <stdio.h>
#include <string.h>
size_t my_strlen(char arr[])
{
	int sz = strlen(arr);
	return sz;
}
int main()
{
	char arr[10] = "abcdefg";
	int num = my_strlen(arr);
	printf("%zu\n", num);
	return 0;
}

在这里插入图片描述

  • 当然我们也可以用指针的形式来实现
  • 字符串的结束标志为‘\0’
  • 指针str是用来存储数组首元素地址的
  • *str是通过解引用str指针得到字符对应的ASCII值
//用指针形式实现求字符串长度
#include <stdio.h>
#include <string.h>
int my_strlen(char* str)  //指针接收
{
	int count = 0;   //统计字符串长度
	while (*str != '\0')
	{
		count++;
		str++;   
	}
	return count;
}
int main()
{
	char arr[10] = "abcdefg";
	int num = my_strlen(arr);
	printf("字符串长度为%d\n", num);
	return 0;
}

在这里插入图片描述

  • 递归实现求字符串长度
  • 自定义函数my_strlen求字符串长度
  • my_strlen(“abcdefg”)
  • 1+my_strlen(“bcdefg”)
  • 1+1+my_strlen(“cdefg”)
  • 1+1+1+my_strlen(“defg”)
  • ……
  • 1+1+……+my_strlen(“\0”)
  • 最后只需让my_strlen(“\0”)返回0即可
//递归实现求字符串
#include <stdio.h>
int my_strlen(char* str)   //指针接收
{
	if (*str != '\0')
		return 1 + my_strlen(str + 1);
	else
		return 0;
}
int main()
{
	char arr[10] = "abcdefg";
	int num = my_strlen(arr);
	printf("字符串的长度为%d\n", num);
	return 0;
}

在这里插入图片描述

首先我们要清楚,char arr[10]="abcdefg"
arr数组里存放的是{ a , b , c , d , e , f , g , '\0'};

在这里插入图片描述
  图中有一处错误,最后一个str是‘\0’的地址,而不是d的地址,因为我们是拿字符串“abc”举例,主要是理清函数每次递归参数值的变化

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

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

相关文章

Monaco 使用 TypeDefinitionProvider

Monaco 中的 TypeDefinitionProvider 和 ImplementationProvider、DefinitionProvider 类似&#xff0c;右键点击变量名称&#xff0c;现在 “选择转到类型定义”&#xff0c; 跳到指定位置。 通过 registerTypeDefinitionProvider 添加 TypeDefinitionProvider 处理方法 实现…

力扣SQL50 按日期分组销售产品 group_concact

Problem: 1484. 按日期分组销售产品 &#x1f468;‍&#x1f3eb; 参考题解 select sell_date, count(distinct product) num_sold,group_concat(distinct product order by productseparator ,) products from activities group by sell_date

度量与增长——OrionX AI算力管理工具的企业价值解读

从科学计算到人工智能&#xff0c;从AI模型开发到AI模型训练&#xff0c;从双精度到半精度&#xff0c;从OPENGL到CUDA&#xff0c;GPU都扮演着关键角色。本文主要从运维的人员的角度出发&#xff0c;来探讨GPU使用过程中遇到的管理问题和创新性解决办法。 GPU的管理和监控 相…

《电容-排容》

节省电路板空间&#xff1a;将多个电容集成在一个封装里&#xff0c;减小了占用的电路板面积。 便于安装和布线&#xff1a;提高生产效率和电路布局的便利性。 一致性较好&#xff1a;由于是同一批次生产&#xff0c;各电容的性能参数较为一致。 【参数】品牌&#xff0c;封…

网络云相册实现--nodejs后端+vue3前端

目录 主页面 功能简介 系统简介 api 数据库表结构 代码目录 运行命令 主要代码 server apis.js encry.js mysql.js upload.js client3 index.js 完整代码 主页面 功能简介 多用户系统&#xff0c;用户可以在系统中注册、登录及管理自己的账号、相册及照片。 每…

Maven实战(四)- 生命周期和插件

Maven实战&#xff08;四&#xff09;- 生命周期和插件 文章目录 Maven实战&#xff08;四&#xff09;- 生命周期和插件1.何为生命周期2.生命周期2.1.Clean生命周期2.1.Default生命周期2.3.Site生命周期 3.Maven插件3.1.插件目标3.2.插件绑定3.2.1.内置插件3.2.2.自定义插件 4…

算法学习day28

一、寻找右区间(二分法) 题意&#xff1a;题目很容易理解 但是转换为二分法有点晦涩 给你一个区间数组 intervals &#xff0c;其中 intervals[i] [starti, endi] &#xff0c;且每个 starti 都 不同 。区间 i 的 右侧区间 可以记作区间 j &#xff0c;并满足 startj > e…

gptpdf深度解析:开源文档处理技术全攻略

目录 一、引言二、gptpdf 是什么&#xff1f;三、gptpdf 的功能特性1. 精准的 PDF 元素解析能力2. 对复杂文档结构的处理示例3. 高效的处理速度4. 低成本的优势 四、gptpdf 应用场景1. 学术研究与文献处理2. 企业文档管理3. 软件开发中的文档转换 五、gptpdf 代码示例1. 基本的…

【Vue3】组件通信之v-model

【Vue3】组件通信之v-model 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的…

图像梯度与几种算子

“滤波器”也可以称为“卷积核”&#xff0c;“掩膜”&#xff0c;“算子”等。 1、Sobel算子 Sobel算子是一个33的卷积核&#xff0c;利用局部差分寻找边缘&#xff0c;计算得到梯度的近似值。x和y方向的Sobel算子分别为&#xff1a; 梯度有方向&#xff0c;对于一个图像&a…

电子元器件—三极管(一篇文章搞懂电路中的三极管)(笔记)(面试考试必备知识点)

三极管的定义及工作原理 1. 定义 三极管&#xff08;Transistor&#xff09;是一种具有三层半导体材料&#xff08;P-N-P 或 N-P-N&#xff09;构成的半导体器件&#xff0c;用于信号放大、开关控制和信号调制等应用。三极管有三个引脚&#xff1a;发射极&#xff08;Emitter…

SpringBoot智慧旅游在线平台的设计与实现(源码+论文+部署讲解等)

博主介绍&#xff1a;✌全网粉丝10W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HLM…

从地铁客流讲开来:地铁客运量特征

1.数据来源 数据来源&#xff1a;MetroWatch地铁观察 | 地铁客流量数据 在做城市地铁客流数据的整理及可视化这块其实国内已经有很多大牛一直在做无偿免费的更新&#xff0c;其中覆盖多城市且每日更新数据的主要有两个&#xff1a;一个是地铁数据库 | 地铁客流量查询 (metrod…

数字农业农村云平台整体规划建设方案PPT

数字农业农村云平台的规划建设方案是一个全面而复杂的项目&#xff0c;涉及到多个方面的整合与创新。根据搜索结果&#xff0c;以下是一些关键点&#xff1a; 资料下载方式&#xff0c;请看每张图片右下角信息 1. 组织领导与政策支持&#xff1a;加强组织领导&#xff0c;确保…

如何在联络中心使用人工智能驱动的语音分析?

人工智能驱动的语音分析是一种使用自然语言处理和机器学习技术的语音识别软件。借助呼叫中心的语音分析&#xff0c;您可以将实时语音转换为文本。之后&#xff0c;程序会评估此文本以揭示有关客户需求、偏好和情绪的详细信息。 在联络中心&#xff0c;语音分析工具有助于&…

OpenCV函数

1&#xff0c;cv2.imread cv2.imread:这个函数可以直接用cv2.imread(filename, cv2.IMREAD_GRAYSCALE)直接将图片以黑白图像输入&#xff0c;也可以通过cv2.imread(img, 0)来将图片以黑白图像输入。其实这两者是一样的&#xff0c;如下图所示&#xff0c;可以将特定的颜色通道…

C语言程序设计之结构体篇2

程序设计之结构体2 问题2_1的代码2_1结果2_1 问题1_2代码1_2结果1_2 问题1_3代码1_3结果1_3 问题1_4代码1_4结果1_4 问题2_1的 函数 f u n fun fun 的功能是&#xff1a; 对 N N N 名学生的学习成绩&#xff0c;按从高到低的顺序找出前 m m m &#xff08; m < 10 m<1…

『 C++11 』模板可变参数包,Lambda表达式与 function 包装器

文章目录 模板可变参数模板可变参数包的展开可变参数包与STL容器中的emplace函数关系 Lambda 表达式function 包装器function 包装器对成员函数的包装bind 绑定 模板可变参数模板 可变参数模板是C11引入的一个特性,允许模板接收任意数量的参数; 该特性增加了C的泛型编程能力; 可…

搭建jenkins一键部署java项目

一、搭建jenkins 链接: https://pan.baidu.com/s/1jzx15PiyI8EhLd_vg7q8bw 提取码: ydhl 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 直接使用docker导入镜像&#xff0c;运行就好 docker run -di --name jenkins -p 8080:8080 -v /home/jenkins_home:/var/je…

黑神话:悟空

《黑神话&#xff1a;悟空》是由游戏科学公司制作的以中国神话为背景的动作角色扮演游戏&#xff0c;将于2024年8月20日发售 [9] [14]&#xff0c;简体中文PC标准版售价268人民币,数字豪华版售价328人民币。 [27] [34] 游戏中&#xff0c;玩家将扮演一位“天命人”&#xff0c…