私は最近 F# を使い始め、エラトステネスのふるいを表す非常に基本的な再帰関数を実装しました。私は次の作業コードを思いつきました:
static member internal SieveOfEratosthenesRecursive sequence accumulator =
match sequence with
| [] -> accumulator
| head::tail -> let rest = tail |> List.filter(fun number -> number % head <> 0L)
let newAccumulator = head::accumulator
Prime.SieveOfEratosthenesRecursive rest newAccumulator
この関数は実際にはメモリ効率が悪いので、変数「rest」と「newAccumulator」を削除しようとしました。次のコードを思いつきました
static member internal SieveOfEratosthenesRecursive sequence accumulator =
match sequence with
| [] -> accumulator
| head::tail -> tail |> List.filter(fun number -> number % head <> 0L)
|> Prime.SieveOfEratosthenesRecursive (head::accumulator)
私が読んだチュートリアルを理解している限り、Prime.SieveOfEratosthenesRecursive は、フィルタリングされたテールを最初のパラメーターとして呼び出し、 head::accumulatorで構成されるリストを 2 番目のパラメーターとして呼び出します。ただし、変数の使用量を減らしてコードを実行しようとすると、プログラムが無限ループに陥ります。なぜこれが起こっているのですか?