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

a22542e7a3d2c225daa39101f223f89d.png 697de1c1289181b8766c567e28ecb670.png ed6dcd0d19eca1bf9b343dd573aee737.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.png 5faf9d7f1887ae531f1d678520fb2287.png

///

//

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

昆虫繁殖

问题描述

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

输入

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

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

输出

z个月后成虫的对数

样例输入:

1 2 8

样例输出:

37

超级楼梯

问题描述

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

输入

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

输出

对于每个测试实例,请输出不同走法的数量

样例输入

2
2
3

样例输出

1
2

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

97fa45317c2038802469cef56403ab25.png

end.

文字,代码,:李怡凡

配图:unsplash,penjee,网络

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值