递归与递推
递归与递推是编程问题中重要的思想,如何更好的理解?看完这篇文章你可能会有收获。
递归
递归定义
递归,就是在运行的过程中不断调用自己本身。可以分为“递”和“归”两个过程,“递”得到每一个小步的结果,再通过“归”将每次运算的结果结合起来。最后得到答案。
递归优缺点
- 优点:代码简解易懂,思维方式符合我们思考的逻辑。
- 缺点:运行效率低,需要调用很多栈来储存返回点和局部量等,容易造成栈溢出。
递推
递推定义
递推,就是从问题的初始条件出发,通过观察得出某种关系式,通过这个关系式推出各项结果。
递推优缺点
- 优点:很好的发挥了计算机重复计算的优点,不会像递推一样占用过多的内存空间。
- 缺点:想象不到递推的关系式,从源头上直接gg(doge 。
例子
裴波那契数列
有一对小兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。按此规律,假设没有兔子死亡,第一个月有一对刚出生的小兔子,问第n个月有多少对兔子?
在草稿纸上进行简单的演算,我们会发现:第一个月1对,第二个月1对,第三个月2对,第四个月3对,第五个月5对,第六个月8对,第七个月13对……从第三项开始,每个月的数量都是前两个月的和
不难得出,当n>=3时,本月兔子数量=上个月数量+上上个月数量。
递归、递推代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int digui(int n) //递归
{
if(n==1||n==2)
return 1;
else
return (digui(n-1)+digui(n-2));
}
int ditui(int n) //递推
{
int x=1,y=1,z;
if(n==1||n==2)
z=1;
else {
for(int i=0;i<n-2;i++){
z=x+y;
x=y;
y=z;
}
}
return z;
}
int main()
{
int n;
scanf("%d",&n);
printf("%d\n",digui(n));
printf("%d\n",ditui(n));
return 0;
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 阿刁!
评论