【C语言回顾】函数递归

  • 前言
  • 1. 递归介绍
  • 2. 简单举例
    • 2.1 简单死循环
    • 2.2 输入输出1234
  • 3. 进阶举例
    • 3.1 求n的阶乘
    • 3.2 strlen函数的模拟实现
  • 结语


在这里插入图片描述


上期回顾: 【C语言回顾】函数
个人主页:C_GUIQU
专栏:【C语言学习】

在这里插入图片描述

前言

各位小伙伴大家好!上期小编给大家讲解了C语言中的函数,接下来讲讲函数的递归!
在这里插入图片描述

1. 递归介绍

【概念】程序调用自身的编程技巧称为递归。(函数自己调用自己)

【思想】

  • 把⼀个⼤型复杂问题层层转化为一个与原问题相似,但规模较小的子问题来求解。直到⼦问题不能再
    被拆分,递归就结束了。
  • 递归的思考方式就是把大事化小的过程。
  • 递归中的递就是递推的意思,归就是回归的意思。

【2个必要条件】

  • 存在限制条件,当满足这个限制条件的时候,递归便不再继续。
  • 每次递归调用之后越来越接近这个限制条件。

2. 简单举例

2.1 简单死循环

#include <stdio.h>
int main()
{printf("cc\n");main();   //重复调用main函数return 0;
}

上述就是⼀个简单的递归程序,只不过上⾯的递归只是为了演⽰递归的基本形式,不是为了解决问
题,代码最终也会陷⼊死递归(死循环),导致栈溢出。

2.2 输入输出1234

【题目描述】

接受一个整型值(无符号),按照顺序打印它的每一位。
例如: 输入:1234,输出 1234

【解题思路】

这种输入输出数字的题,我们一定要想到取模和取余的方法,并且要有限制条件,每次函数递归后,都会越来越接近这个值。
所以先函数递推1234%10=4,123%10=3,12%10=2,1%10=1,给定限制条件n>9,直到n=1,打印出最后值(1),最后函数回归打印出1234。

【代码实现】

void print(unsigned int n) 
{if (n > 9)     //限定条件{print(n / 10);  //取模}printf("%d ", n % 10);  //取余
}
int main()
{unsigned int n = 0;scanf("%u",&n);//按顺序打印1234print(n);return 0;
}

3. 进阶举例

3.1 求n的阶乘

【题目描述】

用递归的方法求n的阶乘(不考虑溢出问题)
例如:
输入:4,输出 24

【解题思路】

n的阶乘为1234…(n-1)n
我们可以先用递推的思想,先算出n(n-1)的值,再用n(n-1)的值乘以(n-2),这样依次乘下去,以n=1为限制条件,返回1。
然后再用回归思想,返回回去,及可得到n的阶乘。

【代码实现】

int JC (int n)
{ if (n == 1) return 1;elsereturn n * JC(n - 1);         //阶乘的递归实现方式        
}
int main()
{int n = 0;scanf("%d", &n);int ret = JC(n);printf("n的阶乘为:%d", ret);return 0;
}

3.2 strlen函数的模拟实现

【题目描述】

用递归的方法模拟实现strlen函数
例如:
输入:abc,输出 3

【解题思路】

strlen函数遇到’\0’才会停止,所以我们以’\0’为限制条件。
我们每调用一次我们自己实现的my_strlen函数,次数就加一,直到遇到’\0’停止。

【代码实现】

int my_strlen(char* str)
{if (*str != '\0'){return 1 + my_strlen(str + 1);     //strlen函数的模拟实现方式}return 0;
}
int main()
{char arr[] = "abc";int ret = my_strlen(arr);printf("%d", ret);return 0;
}

结语

以上就是小编对函数递归的讲解。
如果觉得小编讲的还可以,还请一键三连。互三必回!
持续更新中~!
在这里插入图片描述

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

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

相关文章

给sample_gpt加上,路的选择

灵感 鲁迅说世界上本没有路走的人多了便有了路 如何将灵感转为数学表达 首先假设a到b点有3条路吧&#xff0c;假设你只能选择一条&#xff0c;那意思就是你在训练的时候&#xff0c;只要这条路的值增大别人就会减少。 那这个思思不就是&#xff0c;3条路的值加在一起有个约束…

0.什么是C++(专栏前言)

目录 1.什么是C 2.C的发展史 3.C的重要性 应用&#xff1a; 4.如何学习C 5.关于本专栏 1.什么是C 20世纪80年代&#xff0c;计算机界提出oop(object oriented programming:面向对象&#xff09;思想&#xff0c;支持面向对象的程序设计应运而生。 1982年&#xff0c;本…

网络数据包嗅探器工具

组织的网络非常庞大&#xff0c;包含服务器、交换机、路由器和接入点等众多节点&#xff0c;由于许多资源和流量不断通过这些节点&#xff0c;因此很难确定大量流量是真实的还是安全攻击的迹象&#xff0c;了解和了解组织的网络流量至关重要&#xff0c;一个有用的资源是网络数…

VUE识别图片文字OCR(tesseract.js)

效果:1&#xff1a; 效果图2&#xff1a; 一、安装tesseract.js npm i tesseract.js 二、静态页面实现 <template><div><div style"marginTop:100px"><input change"handleChage" type"file" id"image-input"…

数仓建模—逻辑数据模型

数仓建模—逻辑数据模型 数据模型是数据元素及其基于现实世界对象之间的关系的可视化表示。数据模型揭示并定义数据在业务流程中的连接方式,并支持创建高效的信息系统或应用程序。例如,在商业智能中,数据模型定义用户可以在其分析中使用哪种数据。 逻辑数据模型 (LDM Logi…

初入单元测试

单元测试&#xff1a;针对最小的功能单元(方法)&#xff0c;编写测试代码对其进行正确性测试 Junit可以用来对方法进行测试&#xff0c;虽然是有第三方公司开发&#xff0c;但是很多开发工具已经集成了&#xff0c;如IDEA。 Junit 优点&#xff1a;可以灵活的编写测试代码&am…

ruoyi-cloud-plus添加一个不要认证的公开新页面

文章目录 一、前端1. 组件创建2. src/router/index.ts3. src/permission.ts 二、后端1. 设计思想2. ruoyi-gateway.yml3. 开发Controller 版本RuoYiCloudPlusv2.1.2plus-uiVue3 ts 以新增一个公开的课程搜索页面为例。 一、前端 1. 组件创建 在view目录下创建一个页面的vue…

[激光原理与应用-88]:图解激光在工业加工领域的应用大全以及激光加工的优势

目录 前言&#xff1a; 激光加工分类 一、材料清除 1.1 激光清洗&#xff1a;去除污垢 1.2 激光雕刻&#xff1a;去除多余 1.3 激光划线 1.4 激光切割 1.5 激光打标 1.6 激光打孔 1.7 激光雕刻 二、材料增强 2.1 激光淬火&#xff1a;增加强度 2.2 激光退火&#…

AI+招聘,激活企业的「新质生产力」

两会以来&#xff0c;「新质生产力」成为热词。而所谓的新质生产力&#xff0c;是创新起主导作用&#xff0c;摆脱传统经济增长方式、生产力发展路径&#xff0c;具有高科技、高效能、高质量特征&#xff0c;符合新发展理念的先进生产力质态。新质之「新」&#xff0c;很重要的…

使用JavaScript创建数组,并对其进行冒泡排序

JavaScript创建数组方式 字面量方式&#xff1a;使用方括号 [] 来创建数组&#xff0c;并在方括号内按顺序列出数组元素。 let arr [1, 2, 3, 4, 5]; Array() 构造函数方式&#xff1a;使用 new Array() 构造函数来创建数组&#xff0c;并传入数组元素作为参数。 let arr ne…

xshell的基本命令

1. 创建虚拟环境: conda create -n 虚拟环境名称 python3.7 2. 激活进入虚拟环境 conda activate 虚拟环境名称 3. 退出虚拟环境 conda deactivate 4. 查看所有虚拟环境 conda env list 5. 卸载环境 conda remove -n 虚拟环境名称 --all 6. 执行py文件: python3.py文…

【C语言】sspritnf(组包)和sscanf(解包)简易理解

sprintf(&目标&#xff0c;"%d%d%s",1,2,65) sprintf:组包命令&#xff0c;将最后的值&#xff0c;按照中间的格式&#xff0c;组到目标地址中 sscanf(源数据&#xff0c;"%d%c%s",&目标1&#xff0c;&目标2&#xff0c;&目标3) sscanf&am…