首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Haskell时间问题

Haskell时间问题
EN

Stack Overflow用户
提问于 2013-05-15 06:02:49
回答 1查看 176关注 0票数 0

这是我关于haskell的第二个问题,我认为我的算法节奏不是很差,它在c++和python中给出了更快的结果,haskell有一些问题,它不能给我10^25 (也许它会给我,但我不会等待那么多),这个问题问我这个值,请从现在开始指导我修复这个家伙。

代码语言:javascript
运行
复制
##Euler 169##
giveRes 0 _= 1
giveRes 1 _= 1
giveRes a x = if search a x
                then send a x
                else let res = if rem a 2 == 0
                                  then (giveRes (quot a 2) x)
                                        +
                                       (giveRes (quot a 2-1) x)
                                  else giveRes (quot a 2) x
                     in snd (head ((a,res):x))
search _ [] = False
search a (x:xs) = if a == fst x then True else search a xs
send a (x:xs) = if a == fst x then snd x else send a xs

代码很长,因为它是我的记忆系统,可以缩短时间,但在haskell中效率不高

代码语言:javascript
运行
复制
f 0 _ = 1
f a = if rem a 2 == 0
         then giveRes (quot a 2) + giveRes (quot a 2-1)
         else giveRes (quot a 2)

是代码第一种形式

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-15 09:44:56

  1. 看在上帝的份上,清理你的代码,这样人们就可以阅读它了。例如,重写snd (head ((a,res):x)) --> res。另一个建议:将你的公共子表达式(quot)类型signatures.
  2. Extract添加到命名的let绑定中,以显著减少工作量。
  3. 记忆你对giveRes的调用。这将给你带来最大的好处。如果您搜索SO来查找[haskell] memo,那么您应该会得到很多很好的results.
  4. Don't,使用一个列表作为一个集合来测试成员资格(search),然后使用一个partial function for lookup (send)。相反,可以考虑使用容器或无序容器库中的MapHashMap
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16553594

复制
相关文章

相似问题

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