在学习python递归的时候接触到尾递归,尾递归的要求是,函数的最后一个运算是递归调用,而不是其他的运算。
举阶乘为例子
// tail_recursion.cpp
int fact(int num ){
if(num <= 0 )
return 0 ;
else if(num == 1 )
return 1 ;
else if (num > 1 )
{
return num * fact(num - 1 ) ;
}
}
int fact_tail(int num , int ans){
if(num == 1 ){
return ans ;
}
else if(num <= 0 ){
return 0 ;
}
else if(num > 1 ){
return fact_tail(num - 1 , ans * num ) ;
}
}
第一个函数是我们熟知的递归函数,它的优点是简介易懂。缺点也十分经典,就是大量耗费栈空间,每次调用递归时都要把上一次的数据压栈。第二个函数是我们的尾递归函数。比较两个函数,在递归调用部分,递归函数的最后一个运算是乘法,而尾递归函数里的递归调用是最后一个运算。当最后一个运算是乘法这一类的运算时,我们的就一定要压栈保留原来的数据,用于后来的运算。但是尾递归就不用了,对于尾递归来说,上一次函数的任务已经完成了。它的数据已经通过参数传递了,是完全没有保留意义的,我们是完全可以不用压栈的。