尾递归

与普通递归相比,由于尾递归的调用处于方法的最后,因此方法之前所积累下的各种状态对于递归调用结果已经没有任何意义,因此完全可以把本次方法中留在堆栈中的数据完全清除,把空间让给最后的递归调用。这样的优化1便使得递归不会在调用堆栈上产生堆积,意味着即时是“无限”递归也不会让堆栈溢出。这便是尾递归的优势。

尾递归的本质,其实是将递归方法中的需要的“所有状态”通过方法的参数传入下一次调用中 递归函数设计的问题,嵌入层次太多就会溢出

尾递归就是在函数调用之后再没有其他计算的递归调用。尾递归调用的返回值可以直接当作包含该尾递归调用的函数的返回值。

int f(n) {
   if (n==0) return 1;
   else return n*f(n-1);
}
Corydon(613817) 12:09:53
int f(int n, int temp)
{
    if(i == 0)
        return temp;
    else return f(i-1, temp*i);
}

比较一下,就是返回值的问题.

尾归是把每次的值直接调用.

递归是每次返回函数值.

差异就在函数的开销上 ,函数的内存分配,和尾归调用内存开销上有差别.

你可能感兴趣的:(尾递归)