尾递归优化

参考学习:

https://www.ruanyifeng.com/blog/2015/04/tail-call.html

https://zhuanlan.zhihu.com/p/36587160

一个栈帧一个方法,递归调用时,中间会存着非常多的栈帧,进行运算的只有最上层的栈帧,中间的那些栈帧就很浪费空间。

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;
}
原文地址:https://www.cnblogs.com/xyz-1024/p/14020062.html