我试图使用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的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top