我正在尝试将 Seq.cache 与我制作的函数一起使用,该函数返回最多为 N 的素数序列(不包括数字 1)。我无法弄清楚如何将缓存的序列保留在范围内,但仍然使用它在我的定义中。
let rec primesNot1 n =
{2 .. n}
|> Seq.filter (fun i ->
(primesNot1 (i / 2) |> Seq.for_all (fun o -> i % o <> 0)))
|> Seq.append {2 .. 2}
|> Seq.cache
关于如何使用 Seq.cache 使其更快的任何想法?目前它不断从范围中下降,并且只会降低性能。
Seq.cache
缓存一个IEnumerable<T>
实例,以便序列中的每个项目仅计算一次。不过,就您而言,您正在缓存函数返回的序列,每次调用该函数时都会得到一个new缓存的序列,这对你没有任何好处。正如您所概述的那样,我认为缓存并不是真正解决您的问题的正确方法;相反,你可能应该研究一下记忆。
如果不是定义一个函数,给出小于的素数n
如果你想定义一个无限可枚举的素数序列,那么缓存就更有意义。那看起来更像是这样的:
let rec upFrom i =
seq {
yield i
yield! upFrom (i+1)
}
let rec primes =
seq {
yield 2
yield!
upFrom 3 |>
Seq.filter (fun p -> primes |> Seq.takeWhile (fun j -> j*j <= p) |> Seq.forall (fun j -> p % j <> 0))
}
|> Seq.cache
我还没有比较这个方法和你的方法的性能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)