最終的には末尾再帰の最適化は何ですか?

研究データ構造は、検討されていない場合は、この概念は知っているだろう。

 

また、階乗関数は、最初は一般的な再帰バージョンで最も馴染みのバージョンは、通常、次のとおりです。

 

 

次のように再帰呼び出しのFUNC(5)の場合です。

 

 

 

 

そして、末尾再帰バージョン:

 

 

 このようなコールグラフ:

 

 両方の再帰スタックが5はまあ、それはどのような違いを生むんですように見えますか?

最大の違いは、次のとおりです。最初の再帰共通のため、それぞれの時間は、n * F(N-1)の関数をf(n-1)の待機する必要があります呼び出しが戻る、乗算を行うに復帰。すなわち、復帰前にF(N-1)までは、変数の値であり、nはスタック上に格納されなければなりません。

末尾再帰のために、機能プラス機能を記録する前に、パラメータの結果は、(そこプログラミング幾分類似動的か?)を算出します。最終的にはおよそコールF(N-1、n)は、現在の関数f(nは、1)だから、スタック(F(nは、1)スタック機能)内の変数(例えば、nおよびcur_mul)不要になったが、保存します A。

いわゆる末尾再帰の最適化は、このようなアプローチは、末尾再帰の最適化であることを意味するものではありませんが、むしろことをあなたは末尾再帰を使用する場合、当社のコードはコンパイラが自動的にスタックスペースはもはや離れて最適化するために、コードで必要とされますが、最適化はを参照しますコードの末尾再帰そのコンパイラの最適化コンパイラは、他のことをしない場合は、その点を理解し、私たちの尾の再帰と一般的な再帰的なコードの間のパフォーマンスのギャップが少なく、再帰的にN層です。コンパイラが認識するとのみ末尾再帰コードは、前のスタック内の開口部内に直接関数を再帰的であろうそれぞれの再帰スタック空間で使用されるように、(特に、より複雑な、単にの原理を理解します)、高性能爆薬の再帰スタック層の可能性を防ぐために。最終的には関数呼び出しの先頭に最も深い関数の結果戻るに直接戻ったとき。(実際には、それがループになって!もはや再帰を!)

 

二人は知っているほとんど答え貼付しました:

1.末尾再帰、より線形再帰パラメータより一つは、このパラメータは、最後の呼び出しで得られた結果の関数であり、
したがって、キーポイントは各末尾再帰呼び出しは、コレクションに含まれているだけでなく、線形再帰が展開収集結果を回避することですメモリ消費の欠点。

末尾再帰とは何ですか? - フランキーヤング答え - 知っているほとんどhttps://www.zhihu.com/question/20761771/answer/57214778

 
2.末尾再帰呼び出しは関数の最後に発生したとして、独自のスタックフレームを使用する必要は何もありませんし、それが直接、現在のスタックフレームによってカバーされ、次の再帰呼び出しを行うことができます。
このような結果は、最適化された末尾再帰によるものであり、コール/ RETは、実際に(直接現在のスタックフレームから、及び機能は、その一般インラインすることができ、スタックをプッシュする必要はない)を除去し、得られたマシンコードはサイクルであります同じ。
末尾再帰とは何ですか? - 日が実際に答える - 知っているほとんどhttps://www.zhihu.com/question/20761771/answer/19144609

おすすめ

転載: www.cnblogs.com/FdWzy/p/12556145.html