문제

나는 숫자 1을 제외한 숫자 n까지의 프라임 시퀀스를 반환하는 함수와 함께 seq.cache를 사용하려고 노력하고 있습니다. 캐시 된 시퀀스를 스코프로 유지하는 방법을 알아내는 데 어려움이 있습니다. 내 정의에서.

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 캐시 an 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