我有以下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#开始。我的代码有明显的问题吗?

最佳答案

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

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

10-05 18:50