【发布时间】:2014-05-20 08:52:02
【问题描述】:
我在 C 语言中使用 Eratosthenes 筛非常轻松地回答了 Project Euler 问题 7,我对此没有任何问题。
我对 F# 还是很陌生,所以我尝试实现相同的技术
let prime_at pos =
let rec loop f l =
match f with
| x::xs -> loop xs (l |> List.filter(fun i -> i % x <> 0 || i = x))
| _ -> l
List.nth (loop [2..pos] [2..pos*pos]) (pos-1)
当 pos
然后我尝试将算法更改为
let isPrime n = n > 1 && seq { for f in [2..n/2] do yield f } |> Seq.forall(fun i -> n % i <> 0)
seq {for i in 2..(10000 * 10000) do if isPrime i then yield i} |> Seq.nth 10000 |> Dump
成功运行但仍需要几分钟。
如果我理解正确,第一个算法是尾部优化的,为什么它会崩溃?以及如何编写运行时间不到 1 分钟的算法(我有一台速度很快的计算机)?
【问题讨论】:
-
请证明否决票的合理性
-
100 000 个素数只需要 5 秒:fsharpnews.blogspot.co.at/2010/02/sieve-of-eratosthenes.html
-
我在 22 毫秒内使用此代码 stackoverflow.com/a/12014908/124259 获得了前 1 000 000