解释这两个名词之前,先说下c语言执行程序所使用的空间,分为4个部分:1、传递参数区域2、返回结果区域3、静态区域4活跃区域
递归包含4个阶段1递推、终止条件下终止递推、回归、回归结束,在递推期间将不断增加活跃区域,在回归期间逐渐释放活跃区域。
递归可以让程序以最小粒子形式处理,简单而强大,但是也有两个缺点:1、活跃区域一直占用空间2、释放空间时间过长。
程序如下
#include<stdio.h>
int main(){
int n=4,r;
r=fact(n);
printf("%d",r);
return r;
}
int fact(int n){
if(n == 0){
return 0;
}else if(n == 1){
return 1;
}else if(n > 1){
return n*fact(n-1);
}
}
基于这两个缺点尾递归将会解决这个问题
调用递归方法时,就释放当前活跃区域,然后将自身的返回结果传递到下个方法中,所以就不会一直占用空间,程序如下:
#include<stdio.h>
int main(){
int n=4,r;
r=facttail(n,1);
printf("%d",r);
return 0;
}
int facttail(int n,int a){
if(n == 0){
return 0;
}else if(n == 1){
return a;
}else if(n > 1){
return facttail(n-1,n*a);
}
}
刚开始学习c语言,请见笑。