递归与循环:
同样的操作,在递归中执行的效率要低于循环中执行的效率,因为递归要进行地址的保存,和入栈操作。
2.递归与循环是可以相互转换的
由于这点有时为了程序的效率需要把递归转换成循环:有如下几种常见的转换情形:
尾部递归:尾部递归是指在一个函数中递归出现在最后,此时递归并不需要维持局部变量所以可以放心转换成循环形式。转换方式为把尾部递归的递归条件变成循环条件然后套在整个函数的外面,最后把对参数的操作放在循环中。如下所示:
void f(n) {
if(n>0)
{
f(n+1);
f(n-1); //尾部递归 对参数减一
}
}
void f(n) {
while(n>0)//递归条件改为循环条件
{
f(n+1);
n–; //同样对参数的减一
}
}
第二种需要进行递归消除的是递归树为一条链的时候:
此时就是说函数中的递归只有一个。这个时候可以把递归转换为迭代循环。如下程序所示。
int f(n){
if(n == 0){
return 0;
}
if(n>0){
return n+f(n-1);
}
return sum;
}
int f(n){
int sum = 0;
while(n>0){
sum = n+1;
n–;
}
return sum;
}
还有其他的递归同样可以转换,有的转换为循环可能难度较大,此时可以转化为栈的形式,用入栈出栈模拟函数调用,同样可以提高效率。