热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

递归下降分析程序的设计与实现_算法讲解|如何直观理解递归算法

什么是递归递归是程序设计语言中的一种广泛应用的算法,能大大减少多次重复计算的代码量。递归就是某个函数或者操作在运行中调用自己的现象,类似于一个连环套娃的
a22542e7a3d2c225daa39101f223f89d.png697de1c1289181b8766c567e28ecb670.pnged6dcd0d19eca1bf9b343dd573aee737.png

什么是递归   

递归是程序设计语言中的一种广泛应用的算法,能大大减少多次重复计算的代码量。

递归就是某个函数或者操作在运行中调用自己的现象,类似于一个连环套娃的过程。

518a6c13fd56a74a1cd7835d7cbf7e09.png

///

//

递归的实现

当然,由于计算机的计算能力有限,并且最终需要通过深层的结果求得浅层的结果,我们不可能让递归程序无限进行下去。

58c04fde128bf1d9fc24daa8b4660b04.png

举个例子,我们熟悉的养兔子问题(斐波那契数列)中的项就可以用递归求解。

我们只需要知道

df1bd8cc8fe99297cfaccd201920204d.png

就可以了。

程序会先运行到求f(n)的环节,又因为此时f(n-1),f(n-2)仍未求出,程序会递归到下一层求解,之后求f(n-1)时又因为f(n-2),f(n-3)未知,又会进入下一层递归...直到0和1时,不能继续往下递归,返回上层。用f(0)和f(1)求出f(2)进而返回上层求出f(3),以此类推,直到求出f(n)。

c33bb313ac98f21a749da783b76059c4.gif

我们将上述求解过程分成许多小过程,每个小过程的小结果称为状态

在递归过程中,我们求某一状态前需要之前的状态作为支撑来求解,该过程称为状态转移

///

//

代码实现

我们来看看是如何用代码实现递归这一算法的吧,我们编写一个程序,输入小于等于30的非负整数i,输出f(i),以下给出代码的C语言版本。

#includeint Fibonacci(int n) { if (n == 0 || n == 1)return n; //f(0)==0,f(1)==1,直接返回上层 return Fibonacci(n - 1) + Fibonacci(n - 2); /*递归到下一层, 求出f(n-1),f(n-2)后再返回该层求f(n)*/}int main(void) { int i,fi;//i为输入的数列的序数,fi为输出的f(i)  scanf("%d",&i);//输入 fi=Fibonacci(i);//调用递归函数进行求解  printf("%d\n",fi);//输出 return 0;}

递归过程形成了一个n层的二叉树(每个节点最多有两个子节点),整棵树最多有2的n次方个节点,故该算法的时间复杂度为a0d4100696ce376fc1ca071dec5553bd.png

d91671685602cf353745188d4e03c9d2.png

dc866539113ad3d2cd4c4f2483b6b4e5.png5faf9d7f1887ae531f1d678520fb2287.png

///

//

下面留下几道例题,感兴趣的小伙伴们可以挑战一下哦!

昆虫繁殖

问题描述

 科学家在热带森林中发现了一种特殊的昆虫, 这种昆虫的繁殖能力很强. 每对成虫过x个月产y对卵, 每对卵要过两个月长成成虫. 假设每个成虫不死, 第一个月只有一对成虫, 且卵长成成虫后的第一个月不产卵 (过 x 个月产卵), 问过 z 个月以后, 共有成虫多少对? 

输入

包含三个整数,用空格隔开,分别表示x、y、z。

题目范围 x ≥ 1, y ≥ 1, z ≥ x

输出

z个月后成虫的对数

样例输入:

1 2 8

样例输出:

37

超级楼梯

问题描述

有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?

输入

输入数据首先包含一个整数N&#xff0c;表示测试实例的个数&#xff0c;然后是N行数据&#xff0c;每行包含一个整数M(1<&#61;M<&#61;40),表示楼梯的级数。

输出

对于每个测试实例&#xff0c;请输出不同走法的数量

样例输入

2
2
3

样例输出

1
2

解析我们会在下期推送放出&#xff0c;如果想获取更多资料欢迎加入周行算协招新群↓↓↓

97fa45317c2038802469cef56403ab25.png

end.

文字&#xff0c;代码&#xff0c;&#xff1a;李怡凡

配图&#xff1a;unsplash&#xff0c;penjee&#xff0c;网络




推荐阅读
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • C语言判断正整数能否被整除的程序
    本文介绍了使用C语言编写的判断正整数能否被整除的程序,包括输入一个三位正整数,判断是否能被3整除且至少包含数字3的方法。同时还介绍了使用qsort函数进行快速排序的算法。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文介绍了在Windows系统上使用C语言命令行参数启动程序并传递参数的方法,包括接收参数程序的代码和bat文件的编写方法,同时给出了程序运行的结果。 ... [详细]
  • 本文介绍了GTK+中的GObject对象系统,该系统是基于GLib和C语言完成的面向对象的框架,提供了灵活、可扩展且易于映射到其他语言的特性。其中最重要的是GType,它是GLib运行时类型认证和管理系统的基础,通过注册和管理基本数据类型、用户定义对象和界面类型来实现对象的继承。文章详细解释了GObject系统中对象的三个部分:唯一的ID标识、类结构和实例结构。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了基于c语言的mcs51单片机定时器计数器的应用教程,包括定时器的设置和计数方法,以及中断函数的使用。同时介绍了定时器应用的举例,包括定时器中断函数的编写和频率值的计算方法。主函数中设置了T0模式和T1计数的初值,并开启了T0和T1的中断,最后启动了CPU中断。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
author-avatar
窝窝笑丫
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有