递归可能会用到代码段,静态数据区,堆与栈。
递归阶乘:
int factorial(int n)
{
if (n < 0)
return 0;
else if(n==0)
return 1;
else if(n==1)
return 1;
else
return n * factorial( n-1 );
}
尾递归:所有递归形式都出现在了函数的末尾。是函数参数的覆盖?
尾递归阶乘:
int factorial_tail(int n, int a)
{
if (n < 0)
return 0;
else if(n==0)
return 1;
else if(n==1)
return a;
else
return factorial_tail( n-1, n * a);
}
将递归算法转换为非递归算法有两种方法,一种是直接求值,不需要回溯;另一种是不能直接求值,需要回溯。 前者使用一些变量保存中间结果,称为直接转换法;后者使用栈保存中间结果,称为间接转换法。
int fact(int n)
{
int s=0;
for (int i=1; i <=n;i++)
s=s*i; //用s保存中间结果
return s;
}
尾递归和循环的执行效率都非常高。但是尾递归的递归层数大到一定程度会出现段错误。
尾递归的函数栈开销比普通递归要小的多,执行效率也要大很多。
但是并不是说尾递归就没有函数栈开销。
正因为尾递归具有函数栈开销,其计算极限要比非递归(循环)小很多。