私は Project Euler の問題 27を解決しようとしてきましたが、これは私を困惑させているようです。まず、コードの実行に時間がかかりすぎます (私のマシンでは数分かかるかもしれませんが、もっと重要なのは、しばらく調べてもアルゴリズムに問題があることを実際に見つけることができませんが、間違った答えを返すことです)。 .
これが私の現在のソリューションのコードです。
/// Checks number for primality.
let is_prime n =
[|1 .. 2 .. sqrt_int n|] |> Array.for_all (fun x -> n % x <> 0)
/// Memoizes a function.
let memoize f =
let cache = Dictionary<_, _>()
fun x ->
let found, res = cache.TryGetValue(x)
if found then
res
else
let res = f x
cache.[x] <- res
res
/// Problem 27
/// Find a quadratic formula that produces the maximum number of primes for consecutive values of n.
let problem27 n =
let is_prime_mem = memoize is_prime
let range = [|-(n - 1) .. n - 1|]
let natural_nums = Seq.init_infinite (fun i -> i)
range |> Array.map (fun a -> (range |> Array.map (fun b ->
let formula n = n * n + a * n + b
let num_conseq_primes = natural_nums |> Seq.map (fun n -> (n, formula n))
|> Seq.find (fun (n, f) -> not (is_prime_mem f)) |> fst
(a * b, num_conseq_primes)) |> Array.max_by snd)) |> Array.max_by snd |> fst
printn_any (problem27 1000)
a)このアルゴリズムが実際に正しい答えを返すようにする方法に関するヒント(少なくとも実行可能なアプローチを取っていると思います)およびb)プロジェクトで設定された「1分間のルール」を明らかに超えているため、パフォーマンスを改善しますオイラーFAQ. 私は関数型プログラミングの初心者なので、より機能的なソリューションを念頭に置いて問題をどのように検討するかについてのアドバイスもいただければ幸いです。