书上这样说的:尾递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归。
什么意思呢,就是说我们在写递归函数的时候,最后执行的语句肯定是调用递归函数,并且在调用过程中没有什么加减乘除。
我们拿基本递归来说,如下:
int fact(int n)
{
if (n <= 0)
return 0;
if (n == 1)
return 1;
return n*fact(n-1);
}
看看上面,最后执行的语句有个n*fact,也就是说,这个返回值属于表达式的一部分,所以不是尾递归。
那么,我们要做4!,我们这个代码应该怎么做呢?
具体代码如下:
int fact_2(int n, int a)
{
if (n < 0)
return 0;
else if (n == 0)
return 1;
else if (n == 1)
return a;
else
return fact_2(n-1 , n*a);
}
我是用的是MDK测试这个代码,开了优化之后,的确是正确的