递归算法有何特点


递归算法有何特点

文章插图
递归4-递归360问答的弱点
之所以没有把这段归为算法的讨论,因为这里讨论的不在是算法,而只是讨论一下滥用递归的不好的一面 。
递归的用法似乎是很容易的,但是递归还是有她的致命弱点,那就是如果运用不恰当,滥用递归,程序的运行效率会非常的低,低到什么程度侵协主就东散今,低到出乎你的想像!当然声区错未乐,平时的小程序是看不出许否呀什么的,但是一旦在大项目里滥用递归,效率问易创题将引起程序的实用性的大大降低!
例子:求1到200的自握率耐食投纪举再战降学然数的和 。
第一种做法:
#include<s述开设说较今既宪批tdio.h>
voidm侵哥快杆ain()
{
inti;
intsum=0;
for(i=1;i<=200;i++)
{
sum+=i;
}
printf("%d\n",sum);
}
该代码中使用变量2个,计算200次 。再看下个代码:
#include<stdio.h>
int耐游add(inti)
{
if(i==1)
{
returni;
}
else
{
ret掉布宜过民振号政urni+add(i-1);
}
}
voidmain()
{
inti;
intsu放固陈车杨资m=0;
sum=add(200);
print映海兵美问绿伯她吸f("%d\n",sum);
}
但看add()函数,每次调用要声明一个变量,每次调用要计算一次谓清占向根曲会拉停控谈,所以应该是200个变量,200次计算,对比一下想想,如果程序要求递归次数非常多杀让体评打省推拿材的时候,而且类似与这种情况,我们还能用递归去做吗强北药分矿动袁?这个时候宁愿麻烦点去考虑其他办法,也要尝试摆脱递归的干扰 。
21:21|添加评论|固定链接|引用通告(0)|记录它|计算机与Internet
程序算法5-递归3-递让归的再次挖掘
递归的魅力就在于递归的代码,写出来实在是太简练了,而且能解决很多看起来似乎有规律但是又不是一下子能表达清楚的一些问题 。思路清晰了,递归一写出来年认短教又承安深问题立即就解决了,给人一重感觉期,递归这么好用 。我们在此再境方晶更深的挖掘一下递归的用法 。
之前再强调一点,也许有人会问,你前边的例子用递归似乎是更麻烦了 。是,是麻烦了,因为为了方便理解,只能举一些容易理解的例子,一般等实际应用递归的时候,远远不是这种状态 。
好了我们现在看一个数字的序列;有一组数的集合{1,2,4,7,11,16,22,29,37,46,56……}我故意多给几项,一般是只给前4项让你找规律的 。序列给了,要求是求前50项的和 。规律?有?还是没有?一看就象有,但是又看不出来,我多给了几项,应该很快看出来了,哦,原来每相邻的两项的差是个自然数排列,2-1=1,4-2=2,7-4=3,11-7=4,16-11=5……
好了,把规律找出来了,一开始可能觉得没头绪,没问题,咱们把这个序列存放到一个数组总可以吧!那我们就声明一个数组,存放前50个数据,一个一个相加总可以了 。于是有了下边的写法:
#include<stdio.h>
voidmain()
{
inti,a[50],sum=0;
a[0]=1;
for(i=1;i<50;i++)
{
a[i]=a[i-1]+i;
}
for(i=0;i<50;i++)
{
sum+=a[i];
}
printf("%d\n",sum);
}
好了,代码运行一下,结果出来了,正确不正确呢?自己测试吧,把50项改成1、2、3、4、5……项,试试前多少项是不是正确,虽然这不是正确的测试方法,但是的确是常用的测试方法 。
等到这个代码已经完全理解了,完全明白了正个计算过程,我们就应该对这段代码进行改写优化了,毕竟这个代码还是不值得用一个数组的,那么我们尝试着只用变量去做一下:

推荐阅读