大量查找Seq.find会崩溃(int64)

时间:2018-08-30 09:19:04

标签: f# sequence

我有以下F#代码,该代码应找到给定数x的最小素数:

let smallestFactor x : int64 = 
    [2L .. x] |> Seq.find( fun s -> x % s = 0L )

但是,当我调用大量函数时,例如600851475143我的Visual Studio占用一些GB的内存和所有CPU能力,并且永不返回。 我通过JetBrains ReSharper作为使用C#编写的单元测试来启动代码:

[Test]
public void SmallestFactorOf600851475143()
{
    var result = Problem3.smallestFactor( 600851475143 );
}

我的F#代码和数字是problem 3, Euler Project

解决方案的一部分

我只是从F#开始。我的代码有明显的问题吗?

1 个答案:

答案 0 :(得分:2)

好了,正如已经提到的,表达式[2L .. x]创建了列表,并且为x = 600851475143分配了600851475143 * 8〜4,806 GB,因此这是行不通的。您真正想要的是遍历所有数字,因此顺序将完全适合您:

let smallestFactor x : int64 = 
    seq {2L .. x} |> Seq.find( fun s -> x % s = 0L )