2011-02-09 17 views
5

erlangでのパフォーマンスの前方再帰よりもテール再帰が優れていますか?
また、erlangコンパイラも順方向再帰を最適化しますか?
前方再帰の代わりに末尾再帰を使用する理由はありますか?
私の意見では、順方向の再帰はもっと見栄えがよく見えます。テール再帰vs Erlangでの前方再帰

答えて

3

テール再帰は通常、メモリの使用量が少ないため、より優れています。必要なものだけを次の呼び出しに持ってくるので、スタック上のメモリ使用率が最小限に抑えられます。また、テール再帰コードが最適化されている場合、不要な関数の戻り値は破棄されるため、場合によっては若干早くなります。

たとえば、関数の戻り値が別の関数の呼び出しである場合、スタックに仲介関数を保持する必要はありません。コードは内部関数から呼び出し側に直接ジャンプします。

非テール再帰は、場合によってはErlangコンパイラによってテール再帰に最適化されますが、それにはカウントされません。可能であれば、いつでも尾の再帰関数をコーディングすることをお勧めします。

10

テール再帰と前方再帰は全く異なる概念です。 これを見るdiscussion

テール再帰的で最適化された順方向再帰を書くことができます。テール再帰的でない順方向再帰を書くことも可能である。この場合、最適化されない。すなわち、スタック空間を消費する。

関連する問題