我有以下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 )