1. 程式人生 > 實用技巧 >尾遞迴優化

尾遞迴優化

參考學習:

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;
}