zoukankan      html  css  js  c++  java
  • 尾递归优化

    参考学习:

    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;
    }
    
  • 相关阅读:
    Seaborn学习笔记2
    Seaborn学习笔记1
    HTML学习笔记4
    HTML学习笔记3
    HTML学习笔记2

    指针与引用
    函数
    字符串
    C++简易
  • 原文地址:https://www.cnblogs.com/xyz-1024/p/14020062.html
Copyright © 2011-2022 走看看