题
我试图使用Seq.cache与我提出,返回质数的序列到不包括数字1我无法找出如何保持缓存的序列中的范围,而数量为N的函数仍然使用它在我的定义。
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>
实例,使得序列中的每个项目只计算一次。在你的情况,不过,你缓存函数的返回序列,并在每次调用函数时,你得到的新的缓存的序列,这不会对你有任何好处。我不认为你已经概述它的缓存确实是你的问题的正确方法;相反,你或许应该看看记忆化。
如果代替定义一个函数给要定义素数的无限枚举序列小于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
我还没有相比,该方法相比于你的性能。
其他提示
我想出如何解决我的问题有褶皱,但不是我的使用seq.cache的想法。
let primesNot1 n =
{2 .. n}
|> Seq.fold (fun primes i ->
if primes |> Seq.for_all (fun o -> i % o <> 0) then
List.append primes [i]
else
primes) [2]
您已经采取了看看LazyList?好像它旨在解决同样的问题。它在PowerPack的。
不隶属于 StackOverflow