玩转递归
最近接触了递归,一直在思考递归我们什么时候用?不可否认的是递归会减少很多代码量,使得代码看起来很简洁,但它也存在一定的缺点,滥用定会造成栈溢出的情况。刚好做到了一个关于求和的算法的设计题,重新思考了下,果断把递归应用上去看下效果,但如果求和的项数太多还是不建议使用递归,容易造成栈溢出。这里只是好奇心驱动我尝试哈。一个是关于前N个数求和的算法PK,一种是普通的累计加起来,另外一种是采用递归的形式。
int Sum(int m,int n)//要求输出的参数从最低的m加到n
{
int sum=0;
if(m > n)//合法性检测
{
sum = -1;/ 非法输入标志
}
else
{
while(m<=n)//从最低的那个数字开始加起来,知道m
{
sum +=m;
m++;
}
}
return sum;
}
int SumRe(int m,int n)//递归
{
if(m <= n)
{
return SumRe(m+1,n)+m;//对于后面有m,因此前面不能采用++m,这是因为++m之后m的值发生更新,影响后面的m!!
}
else //当m值超过n的时候终止条件
{
return 0;
}
}
int main()//代码测试,运算结果都是5005,运行平台VS2010
{
printf("普通计算结果:%d",Sum(10,100));
printf("递归计算结果:%d",SumRe(10,100));
while(1);
return 0;
}
结论:只要算法的模型符合具有栈结构的设计思路的,同时具有递归结束条件的都可以用递归来设计。不过递归使用请慎用,切勿滥用。