什么是尾递归。或许我们直接用一般递归和尾递归比较一下,就能了解什么是尾递归了。
尾递归是针对一般递归进行了优化。
我们先说一下,
一般递归:
public static int f(int n) {
if (1 == n)
return 1;
else
return n*(n-1);
}
运行:
f(5)
5*f(4)
5*4*f(3)
5*4*3*f(2)
5*4*3*2*1
一般递归,每一级递归都需要调用函数,每次递归都带有新的变量,所以每次都会创建新的栈,随着递归会深度增加。栈越多的话,会出现爆栈的情况。
接下来说,
尾递归:
public static int f(int n,int m=1) {
if (0== n)
return m;
else
return f(n-1,n*m);
}
稍微修改了一下代码
运行:
f(5,1)
f(4,5*1)
f(3,5*4)
f(2,5*4*3)
f(1,5*4*3*2)
f(0,5*4*3*2*1)
5*4*3*2*1
可以看到每一级递归调用函数都是成线性的形式。每次递归返回的都是相同的函数,没有产生新的变量,这样一来就不需要每级都创建新的栈。就能够避免爆栈的问题。
也就是说 尾递归不压栈,对一般递归进行了优化。
有部分文字是参考了该博主的 https://blog.csdn.net/ialexanderi/article/details/81482878