尾遞迴優化
阿新 • • 發佈:2020-11-22
參考學習:
一個棧幀一個方法,遞迴呼叫時,中間會存著非常多的棧幀,進行運算的只有最上層的棧幀,中間的那些棧幀就很浪費空間。
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;
}