作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试获取大量的质因数..
let factors (x:int64) =
[1L..x]
|> Seq.filter(fun n -> x%n = 0L)
let isPrime (x:int64) =
factors x
|> Seq.length = 2
let primeFactors (x:int64)=
factors x
|> Seq.filter isPrime
这适用于 13195,但因 600851475143 的 OutOfMemoryException 而失败?
抱歉,如果我遗漏了一些明显的东西,这只是我使用 F# 的第三天,直到今天早上我才知道什么是素数。
最佳答案
表达式 [1L..x]
创建一个列表,在您的示例中,该列表太大而无法存储在内存中。
相比之下,序列是惰性的,因此如果小心使用,您可以避免计算整个中间列表。您的代码已经使用序列,但如前所述,它以列表开头,为避免从列表转换,您可以使用大括号:{1L..x}
使用序列表达式是另一种选择:
let factors (x:int64) = seq {
for i = 1L to x do
if x%i = 0L then yield i}
解决了 OutOfMemoryException
问题后,您的 prime 函数非常慢,您可以按照注释中的建议对其进行优化,方法是在找到 1 与其之间的除数后立即返回 false
平方根。可以通过将数字除以找到的质数因子并使用质数筛来实现进一步的优化,您还可以查看一些有效的算法 here .
关于f# - 此质因数分解代码适用于小数,但对于大数会因 OutOfMemoryException 而失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27723289/
我只是写了下面的代码来利用筛法找到大于 2 的某个自然数的最大质因数。 该程序构建、运行并适用于较小的测试值,但对于大于 1000000 的值只会崩溃。 我自己写了这个——并且相信它可能会非常低效——
我是一名优秀的程序员,十分优秀!