我一直在Haskell中解决Project Euler #14已有一段时间,但是由于某种原因,我无法使其正常运行。我前一段时间使用Groovy解决了这个问题,我认为这里使用的是基本相同的方法。但是,即使仅找到前10,000个长度,该程序的运行速度也非常慢,我现在真的迷失了原因。我想我使用的是对记性,但是即使GHCI中的数据集很小,我的内存也用光了。

到目前为止,这是我想出的。

collatz = (map collatz' [0..] !!)
    where collatz' n
        | n == 1 = 1
        | n `mod` 2 == 0 = 1 + collatz (n `div` 2)
        | otherwise = 1 +  collatz (3 * n + 1)


我会运行map collatz [1..1000000]以获得问题的答案,但是map collatz [1..10000]给我一个内存不足的错误,并且还需要花费很长时间才能完成运行。

如果有人可以给我一些有关该程序有什么问题的见解,那太好了!我已经尝试了很多东西,但是我只是被卡住了,需要帮助。

谢谢!

最佳答案

备忘录化在这里工作得很好。实际上,它的运行情况如此之好,以至于它会占用您的所有内存。 Collat​​z序列的中间项变得越来越大。从11000000的任何序列中出现的最大名词是数字2974984576。因此,这就是您要在内存中构建的列表的长度。

另一方面,仅在没有备注的情况下直接实现Collat​​z函数就可以很好地解决此问题。

08-27 04:06