Он В Расцвете Сил?


Просто потому что мне скучно, я написал еще один генератор простых чисел. Я думаю, что это довольно чисто, но я не удивлюсь, если кто-то найдет что-то комментировать.

let isPrime (knownPrimes :int list) currentNumber =
    List.forall (fun i -> currentNumber % i <> 0) knownPrimes

let rec primes knownPrimes currentNumber =
    match isPrime knownPrimes currentNumber with
    | true ->
        Console.WriteLine(currentNumber)

        primes (currentNumber::knownPrimes) (currentNumber + 2)
    | false -> primes knownPrimes (currentNumber + 2)

[<EntryPoint>]
let main argv =
    Console.WriteLine(2)
    primes [2] 3 |> ignore
    0


Комментарии
1 ответ

Писать что-то последовательно в консоль имеет очень мало значения. Ок, primes возвращает список простых чисел, но вы действительно не можете использовать их, пока все простые числа вычисляются в области intи это очень много.

Например, бесполезно писать

primes [2] 3  |> Seq.take 10 |> Seq.iter (printfn "%i")

потому что он не вернется до все простые числа вычисляются.

Это кстати странно, что клиент primes чтобы выяснить, что 2 является ярким :-): primes [2] 3 |> ignore

Вы можете изменить функцию, чтобы взять максимум или значение счетчика, чтобы остановить генератор, когда хватит.

В качестве альтернативы это ММО более полезными для возврата Seq простых, потому что он возвращает числа, как только они будут индивидуально рассчитываться:

let enumPrimes = 
let rec primes currentNumber knownPrimes =
match isPrime currentNumber knownPrimes with
| true ->
seq {
yield currentNumber
yield! (primes (currentNumber + 2) (currentNumber::knownPrimes))
}
| false -> primes (currentNumber + 2) knownPrimes

seq {
yield 2
yield! [2] |> primes 3
}


Когда определить, является ли число премьер, надо только проверить штрихов до (включительно) квадратный корень из числа:

let isPrime currentNumber knownPrimes =
let sqrtNum = sqrt (float currentNumber) |> int
knownPrimes |> List.rev |> List.takeWhile (fun p -> p <= sqrtNum) |> List.tryFind (fun p -> currentNumber % p = 0) = None

3
ответ дан 31 марта 2018 в 06:03 Источник Поделиться