首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >该memoization是否正常工作?

该memoization是否正常工作?
EN

Stack Overflow用户
提问于 2012-08-07 23:54:15
回答 1查看 375关注 0票数 4

我已经在Haskell致力于解决Project Euler #14有一段时间了,但由于某些原因,我无法让它工作。不久前我使用Groovy解决了这个问题,我想我在这里使用的基本上是相同的方法。然而,即使只找到前10,000个长度,程序的运行速度也令人难以置信地慢,我现在真的不知道为什么。我认为我使用memoization是正确的,但即使在GHCI中使用较小的数据集,我也会耗尽内存。

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

代码语言:javascript
复制
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]会给我一个内存不足的错误,而且也需要几秒钟才能完成运行。

如果有人能给我一些关于这个程序的问题的见解,那就太好了!我试过很多东西,但我就是卡住了,需要帮助。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-08 00:30:50

记忆化在这里运行得很好。事实上,它工作得如此之好,以至于它填满了你所有的记忆。Collatz序列的中间项变得相当大。从1开始直到1000000的任何序列中出现的最大项是数字2974984576。这就是你试图在内存中构建的列表的长度。

另一方面,直接实现Collatz函数而不使用memoization应该可以很好地解决这个问题。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11849664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档