9

oCaml がこのコードを末尾再帰に最適化するかどうか疑問に思っています。そうであれば F# もそうですか?

let rec sum xs =
  match xs with
    | [] -> 0
    | x :: xs' -> x + sum xs'
4

2 に答える 2

13

再帰的な場合 (つまり、xs が空でない場合)、最後に評価される演算は加算です。関数を末尾再帰にするためには、最後に評価された操作が sum の再帰呼び出しである必要があります。

このような関数は通常、末尾再帰にするためにアキュムレータを含むヘルパー関数を使用して定義されます。この場合、それは合計されるリストと合計の現在の値を取る関数になります。リストが空の場合、合計の現在の値が返されます。リストが空でない場合は、リストの末尾と合計の現在の値 + リストの先頭を引数として自分自身を呼び出します。sum 関数は、リストと合計の現在の値として 0 を使用してヘルパー関数を呼び出すだけです。

于 2010-02-27T13:22:19.610 に答える
5

いいえ、このコードは末尾再帰ではなく、ocaml はそれを変換しません。あなたはそれを自分でしなければなりません。

F# についてはわかりませんが、これが最適化されるとは思えません。

于 2010-02-27T13:08:03.100 に答える