2016-12-04 8 views
0

完全なテール再帰ではない関数でg ++でテールコールの最適化を行うにはどうすればよいですか?例えば再帰関数の部分的なテールコールの最適化はありますか?

void foo(Node *n) { 
    if (n == nullptr) return; 

    foo(n->left); 
    cout << n->datum; 
    foo(n->right); 
} 

これがfooでは、(N->左)末尾再帰ではありませんが、FOO(N->右)です。これを最適化する方法はありますか?

+1

あなたがこのことを妄想しているなら、あなたはいつもあなたの再帰関数を反復的なものに変えることができます(明確にするために、私はそれをすることを推奨していません)。 – bolov

+2

g ++ [可能であれば再帰を避けるために、-O3上で(https://godbolt.org/g/TEJvLv)を実行してください。 -O2では、ちょっとばかげて、2回目の呼び出しをジャンプに変えたばかりです。 –

答えて

0

答えは:あなたのコンパイラに、非常にうまく聞いてください。

C++仕様では、観察可能な結果が同じであれば、最適化を実装できます。

このコードでは、部分的なテールの最適化は、明らかに同じ観察可能な結果を​​生成します。実際に発生するかどうかは、コンパイラによってまったく異なります。 C++仕様ではここでテール最適化を実行する必要はありませんが、それを禁止するものではありません。これは完全にあなたのコンパイラに任されています。そして、現代のC++コンパイラが十分に積極的な最適化レベルでこれを行う可能性はかなり高いです。

関連する問題