我最近开始使用 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组成的列表作为第二个参数。但是,当我尝试使用减少的变量使用来运行代码时,程序会陷入无限循环。为什么会发生这种情况,我做错了什么?