0

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

##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 中它效率不高

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)

是该代码的第一种形式

4

1 回答 1

9
  1. 看在上帝的份上,清理你的代码,以便人们可以阅读它。例如,重写snd (head ((a,res):x)) --> res. 另一个建议:添加类型签名。
  2. 将您的公共子表达式 ( ) 提取quot到命名的 let 绑定中,以显着减少工作量。
  3. 记住您对 giveRes 的呼叫。这将为您带来最大的好处。如果您搜索 SO,[haskell] memo那么您应该会得到很多好的结果。
  4. 不要将列表用作测试成员资格 ( search) 的集合,然后使用部分函数进行查找 ( send)。而是考虑使用容器MapHashMap无序容器库中的 or 。
于 2013-05-15T01:44:56.190 回答