目录

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语言带你玩转递归相关推荐

  1. 知道的C君带你学语言的作业答案,知到《C君带你玩编程》2020章节测试(含答案)...

    <知到<C君带你玩编程>2020章节测试(含答案)>由会员分享,可在线阅读,更多相关<知到<C君带你玩编程>2020章节测试(含答案)(16页珍藏版)> ...

  2. 悠漓带你玩转C语言(数组)

    1. 一维数组的创建和初始化. 1.1 数组的创建 数组是一组相同类型元素的集合 数组的创建方式: type_t arr_name [const_n]; //type_t 是指数组的元素类型 //co ...

  3. 疯狂的大柚柚带你玩转MSP-ESP430G2(基础篇)——(二)MSP-ESP430G2 语言

    疯狂的大柚柚带你玩转MSP-ESP430G2(基础篇) (二)MSP-ESP430G2 语言 关键字: if if-else for switch case while do-while break ...

  4. 独家直播双十一全网动态?前黑客“劳改”带你玩转大数据

    独家直播双十一全网动态?前黑客"劳改"带你玩转大数据 发表于2015-11-24 10:26| 4044次阅读| 来源CSDN| 7 条评论| 作者蒲婧 CTO俱乐部CTOCTO讲 ...

  5. AI之Robot:带你玩转机器人DIY机器人——让你成为机器人的真正主人

    AI之Robot:带你玩转机器人&DIY机器人--让你成为机器人的真正主人 目录 关于机器人 知识框架--Chatbot Conversation Framework 语境--语言语境& ...

  6. 【转】带你玩转Visual Studio——03.带你了解VC++各种类型的工程

    上一篇文章带你玩转Visual Studio--带你新建一个工程一文中提到新建一个工程时会有很多的工程类型(图1),现在将简单介绍各种类型工程的含义和主要用途.由于这里包含的工程类型太多,有很多本人也 ...

  7. 【转】带你玩转Visual Studio——02.带你新建一个工程

    接着上一篇文章带你玩转Visual Studio--开篇介绍继续讲这个主题,现在我们从创建一个新的工程开始. 一步一步创建项目 依次选择菜单:File\New\Project,打开New Projec ...

  8. 【转】带你玩转Visual Studio——01.开篇介绍

    开篇之前,先唠叨几句 本人从事C++开发工作一年半,总想就C++开发方面写点东西.写什么呢?想了一下还是写点跟开发密切相关的吧,要说跟开发最密切相关的那莫过于就是开发工具了,也就是常常说的集成开发环境 ...

  9. NumPy入门攻略:手把手带你玩转这款强大的数据分析和计算工具

    导读:NumPy(Numerical Python的简称)是高性能科学计算和数据分析的基础包,提供了矩阵运算的功能. 在处理自然语言过程中,需要将文字(中文或其他语言)转换为向量.即把对文本内容的处理 ...

最新文章

  1. linux git yum安装包下载,在CentOS 8上用Yum及源代码安装Git的方法
  2. 昌邑机器人_上下料机器人昌邑机器人生产工厂
  3. 你知道人工智能为什么这么火?
  4. axi dma direct 模式 总结
  5. Ubuntu通过apt-get安装指定版本和查询指定软件有多少个版本
  6. c语言图像浏览器,单片机采用浏览器进行监控将给软件的编程带来极大的便利...
  7. Codeforces Round #396 (Div. 2) E. Mahmoud and a xor trip 二进制拆位+树型dp
  8. C# 读取指定目录中的所有文件,并按规则生成SQL语句!
  9. [渝粤教育] 南宁师范大学 聆听中国(南宁师范大学慕课) 参考 资料
  10. Linux-insmod/rmmod/lsmod驱动模块相关命令(10)
  11. sublime c语言如何编译,Sublime Text 3 实现C语言代码的编译和运行(示例讲解)
  12. (转)基于Metronic的Bootstrap开发框架经验总结(9)--实现Web页面内容的打印预览和保存操作...
  13. W3C 宣布:WebAuthn 成为正式 Web 标准
  14. 学python lesson2
  15. INV 调试: 如何获取库存物料事务处理调试信息
  16. java程序如何提取数据库json格式_java解析json格式文件,再保存在数据库怎么做?...
  17. OPERA固定价格学习
  18. 数字图像处理第五章——图像复原与重建
  19. 什么是RFID技术?RFID技术介绍
  20. 米兰•昆德拉 漂浮的一生

热门文章

  1. EDIUS和VEGAS有什么区别
  2. 2014牡丹江 现场赛 F zoj 3824 Fiber-optic Network
  3. 微软CEO史蒂夫·鲍尔默十大名言:我要活埋谷歌CEO
  4. python项目实战(一):购物商城(采用面向过程思想开发)
  5. JavaSE-常用类、Stream 流式计算
  6. 滚动截屏苹果_苹果全球开发者大会最全汇总:平板推独立系统 两款新硬件亮相...
  7. java-实现飞机大战小游戏
  8. KVM虚拟机创建时绑定固定IP
  9. 使用HTML+CSS写一个静态页面
  10. hdu2126 Buy the souvenirs 01背包变形 dp