11

末尾再帰関数が反復アルゴリズムよりも好まれる理由を説明している記事を見つけることができませんでした。

どこでも明確に説明されていると思う単純な再帰よりも末尾の再帰が優れている理由を尋ねているわけではありません。

なぜ

sum(n) = {
    def sumImpl(n, acc) = if(n <= 0) acc  else sumImpl(n - 1 , n + accumulator)
    sumImpl(n, 0)
}

よりも好ましい

sum = 0;
while(n--) sum += n
4

2 に答える 2

9

再帰はプログラムを読みやすくしますが、パフォーマンスは低下します。反復プロシージャはパフォーマンスは良好ですが、それほど読みやすくなく、中間値を格納するためにローカル変数が必要になる場合があります (可変性)。末尾再帰を使用すると、両方の長所が得られ、「合計」変数は必要ありません (不変性)。これは、結果を次の再帰関数呼び出しに転送するだけなので、stackoverflow 例外が発生しないため、多数の合計または階乗を計算する場合に非常に役立ちます。

並列環境では、不変性は非常に重要です。コードを編集して、非常に大きな数値を関数に渡して違いを確認してください。

ここでさらに読む

于 2012-10-16T02:45:07.173 に答える