参考学习:
一个栈帧一个方法,递归调用时,中间会存着非常多的栈帧,进行运算的只有最上层的栈帧,中间的那些栈帧就很浪费空间。
int f(n){
if(n==1) return 1;
return n*f(n-1);
}
中间的栈帧还保留着一些信息,等着方法开始一层层的出栈时使用这些信息。但实际上这些信息可以直接传给新建的栈帧,原先的栈帧就没必要保存信息。
int f(n,res){
if(n==1) return 1*res;
return f(n-1,res*n);
}
这种时候有些编译器就可以进行尾递归优化,中间的那些栈帧就没必要存在了(C语言可以做到,Java做不到)。
这也意味着可以进行尾递归优化的地方就可以使用循环来代替,当你意识到可以使用尾递归时,就可以把代码转化为循环。
int f(n){
int res=1;
for(int i=n;i>=1;i--){
res*=i;
}
return res;
}