我一直在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]
给我一个内存不足的错误,并且还需要花费很长时间才能完成运行。如果有人可以给我一些有关该程序有什么问题的见解,那太好了!我已经尝试了很多东西,但是我只是被卡住了,需要帮助。
谢谢!
最佳答案
备忘录化在这里工作得很好。实际上,它的运行情况如此之好,以至于它会占用您的所有内存。 Collatz序列的中间项变得越来越大。从1
到1000000
的任何序列中出现的最大名词是数字2974984576
。因此,这就是您要在内存中构建的列表的长度。
另一方面,仅在没有备注的情况下直接实现Collatz函数就可以很好地解决此问题。