用C语言带你玩转递归
目录
1.什么是递归?
2.无返回值的递归
3.有返回值的递归
4.递归的弊端
1.什么是递归?
用博主的话讲,一个函数在其内部自己反复调用自己的的过程就是“递”,调用结束后的层层返回则是“归”。无论是有返回值还是没有返回值的函数,在其递归的过程中,都需要一个条件去限制它递归的次数,以防止“死递归”的产生,那递归究竟该如何去使用呢?我们通过一个简单的案例的解释一下。
2.无返回值的递归
我们看一下下面这道题:
用递归实现数字的正序打印。
题的意思很简单,就是给出一个数,让我们从第一位到最后一位一次打印出来。
比如输入 1234 这个数字,打印出来的效果就是1 2 3 4。
那么用递归该如何去实现这个打印呢?
我们并不知道这个数字有多少位,只能从最后一位进行依此拆分也就是每一次都打印n%10,再让n/10,直到n只剩下一位数字的时候停止,但是按照这个思路来实现好像会逆序打印出数字的每一次,这个时候递归的作用就体现出来了。
如果我们让递归的最后一层打印数字的第一位,倒数第二层打印数字的倒数第二位...这样下来就可以依此打印出每一位的数字,达到正序打印的目的,也就是说我们在函数调用自己之后在去打印n%10的操作就可以实现正序打印了,接下来我们实践一番。
#include <stdio.h>
// 一
void Point(int n)//1234->4
{if (n > 9){// 二 三 四Point(n / 10);//123->3 12->2 1->1}printf("%d ", n % 10);//归的时候按照四三二一的顺序 打印出来也就是1 2 3 4
}
int main()
{int n;scanf("%d", &n);Point(n);return 0;
}
打印出来也确实如此:
3.有返回值的递归
无返回值的递归我们进行了说明,那么有返回值的递归该怎么实现呢?
还是用一个案例来说明:
用递归实现n的阶乘
可能会有小伙伴有疑问,我会用递归得到1 2 3 4 5,可怎么把它们乘到一起去呢?
不要着急,我们对每一次递归都进行分析,有了上一个案例的解释,我们很容易就可以得到1,2,3,4,5这5个数字,只需要每次递归传入(n-1)就行了,那么将它们想乘也用同样的道理就可以了,首先我们先来确定一下递归停止的条件,我们知道阶乘是肯定不能把0成进去的,所以条件显而易见:当n > 1的时候进行递归(因为n = 0的时候递归为0),那么1怎么办呢?我们可以多判断一次,当n = 1的时候返回值为1,也就是return 1。1的返回有了着落我们开始进行2的操作。
我们既然要返回阶乘,那么返回的数自然也是数字相乘的结果,那我们为什么不把返回的结果和n相乘一起返回去呢?1的返回我们已经有了,到2的时候我们返回1*2;到3的时候我们返回(1*2)*3...以此类推,那我们n > 1时的返回结果就也可以确定了,就是return n*fac(n - 1)。(fac是函数名)。
#include <stdio.h>int fac(int n)
{if (n == 1)return 1;elsereturn n * fac(n - 1);
}
int main()
{int n, m;scanf("%d", &n);m = fac(n);printf("%d\n", m);return 0;
}
4.递归的弊端
小伙伴们们可能有疑惑,递归这么好用,代码量又少,怎么会有弊端呢?
弊端是肯定有的,只不过上面的题目表现不出来罢了,递归虽然可以用少量的代码就可以实现复杂的操作,但是这通常是以牺牲时间为代价的。比如 我们来看一下下面这道题:
用递归求斐波那锲数
(斐波那锲数是 1 1 2 3 5 8 13.... 除了前两个数是1不变,后面的数字都是它前面两个数的相加之和)
这是一道很经典的题目,这道题目有了上面两道题做铺垫相信已经难不倒大家,这里我们直接给出源码。
#include <stdio.h>int fbn(int n)
{if (n == 1 || n == 2)//1,2的时候是1return 1;elsereturn fbn(n - 1) + fbn(n - 2);//返回前两项相加之和
}
int main()
{int n, m;scanf("%d", &n);m = fbn(n);printf("%d\n", m);return 0;
}
我们测试一下就可以知道,当传入的数字超过40的时候,通常要等好长时间才可以得到答案,这是为什么呢,我们进行测试一下就知道了
我们用了一个全局变量count来记录这个递归计算了多少次n = 3的斐波那锲数
结果发现非常的惊人,当n = 40的时候,n = 3的情况被计算了将近4千万次,由此想一想其他的数字,计算量加起来可能已经冲破天际了,也就是有了这样的计算量,计算的才如此之慢。
由此可见,也不是什么情况下都应该使用递归,有时可能会适得其反。
好了, 到了这里文章就结束了,感谢小伙伴们的观看,以后会有更多知识点进行分享。
用C语言带你玩转递归相关推荐
- 知道的C君带你学语言的作业答案,知到《C君带你玩编程》2020章节测试(含答案)...
<知到<C君带你玩编程>2020章节测试(含答案)>由会员分享,可在线阅读,更多相关<知到<C君带你玩编程>2020章节测试(含答案)(16页珍藏版)> ...
- 悠漓带你玩转C语言(数组)
1. 一维数组的创建和初始化. 1.1 数组的创建 数组是一组相同类型元素的集合 数组的创建方式: type_t arr_name [const_n]; //type_t 是指数组的元素类型 //co ...
- 疯狂的大柚柚带你玩转MSP-ESP430G2(基础篇)——(二)MSP-ESP430G2 语言
疯狂的大柚柚带你玩转MSP-ESP430G2(基础篇) (二)MSP-ESP430G2 语言 关键字: if if-else for switch case while do-while break ...
- 独家直播双十一全网动态?前黑客“劳改”带你玩转大数据
独家直播双十一全网动态?前黑客"劳改"带你玩转大数据 发表于2015-11-24 10:26| 4044次阅读| 来源CSDN| 7 条评论| 作者蒲婧 CTO俱乐部CTOCTO讲 ...
- AI之Robot:带你玩转机器人DIY机器人——让你成为机器人的真正主人
AI之Robot:带你玩转机器人&DIY机器人--让你成为机器人的真正主人 目录 关于机器人 知识框架--Chatbot Conversation Framework 语境--语言语境& ...
- 【转】带你玩转Visual Studio——03.带你了解VC++各种类型的工程
上一篇文章带你玩转Visual Studio--带你新建一个工程一文中提到新建一个工程时会有很多的工程类型(图1),现在将简单介绍各种类型工程的含义和主要用途.由于这里包含的工程类型太多,有很多本人也 ...
- 【转】带你玩转Visual Studio——02.带你新建一个工程
接着上一篇文章带你玩转Visual Studio--开篇介绍继续讲这个主题,现在我们从创建一个新的工程开始. 一步一步创建项目 依次选择菜单:File\New\Project,打开New Projec ...
- 【转】带你玩转Visual Studio——01.开篇介绍
开篇之前,先唠叨几句 本人从事C++开发工作一年半,总想就C++开发方面写点东西.写什么呢?想了一下还是写点跟开发密切相关的吧,要说跟开发最密切相关的那莫过于就是开发工具了,也就是常常说的集成开发环境 ...
- NumPy入门攻略:手把手带你玩转这款强大的数据分析和计算工具
导读:NumPy(Numerical Python的简称)是高性能科学计算和数据分析的基础包,提供了矩阵运算的功能. 在处理自然语言过程中,需要将文字(中文或其他语言)转换为向量.即把对文本内容的处理 ...
最新文章
- linux git yum安装包下载,在CentOS 8上用Yum及源代码安装Git的方法
- 昌邑机器人_上下料机器人昌邑机器人生产工厂
- 你知道人工智能为什么这么火?
- axi dma direct 模式 总结
- Ubuntu通过apt-get安装指定版本和查询指定软件有多少个版本
- c语言图像浏览器,单片机采用浏览器进行监控将给软件的编程带来极大的便利...
- Codeforces Round #396 (Div. 2) E. Mahmoud and a xor trip 二进制拆位+树型dp
- C# 读取指定目录中的所有文件,并按规则生成SQL语句!
- [渝粤教育] 南宁师范大学 聆听中国(南宁师范大学慕课) 参考 资料
- Linux-insmod/rmmod/lsmod驱动模块相关命令(10)
- sublime c语言如何编译,Sublime Text 3 实现C语言代码的编译和运行(示例讲解)
- (转)基于Metronic的Bootstrap开发框架经验总结(9)--实现Web页面内容的打印预览和保存操作...
- W3C 宣布:WebAuthn 成为正式 Web 标准
- 学python lesson2
- INV 调试: 如何获取库存物料事务处理调试信息
- java程序如何提取数据库json格式_java解析json格式文件,再保存在数据库怎么做?...
- OPERA固定价格学习
- 数字图像处理第五章——图像复原与重建
- 什么是RFID技术?RFID技术介绍
- 米兰•昆德拉 漂浮的一生
热门文章
- EDIUS和VEGAS有什么区别
- 2014牡丹江 现场赛 F zoj 3824 Fiber-optic Network
- 微软CEO史蒂夫·鲍尔默十大名言:我要活埋谷歌CEO
- python项目实战(一):购物商城(采用面向过程思想开发)
- JavaSE-常用类、Stream 流式计算
- 滚动截屏苹果_苹果全球开发者大会最全汇总:平板推独立系统 两款新硬件亮相...
- java-实现飞机大战小游戏
- KVM虚拟机创建时绑定固定IP
- 使用HTML+CSS写一个静态页面
- hdu2126 Buy the souvenirs 01背包变形 dp