尾递归
以计算阶乘为例:
普通递归:
int factorial(int n)
{
if (n < 2) return 1;
else return n * factorial(n - 1);
}
尾递归:
int factorial(int n, int accum)
{
if (n < 2) return accum;
else factorial(n - 1, n * accum);
}
普通递归的计算顺序是从头到尾,再从尾到头,得出结果。由于函数嵌套太深,普通递归可能会引起栈溢出。
尾递归的计算顺序是从头到尾,得出结果。所以少了从尾回到头这一步,因此运行子层函数时,父层函数的栈可以完全清除(由编译器优化),不影响最后计算结果。如此一来即使进行无限次递归,也不会引起栈溢出。