如何根据Haskell中的先前答案使Haskell使用另一个列表

时间:2009-10-15 09:35:56

标签: haskell optimization

我在做项目问题63,我必须找到存在的数字的数量:

x^(n) == y

n的长度为y

很快就会出现这种情况的结果在奇数和偶数之间交替,所以我在Haskell中想出了这个:

prob63 = [ n | n <- nums n , i <-[1..10], i^(length $ show n) == n]

nums n | odd (n) == True = filter odd [n..]
    | otherwise         = filter even [n..]

如果n&lt; - [1 ..],prob63产生一个如下所示的流:

[1,2,3,4,5,6,7,8,9,16,25,36,49,64,81,125,216,343,512,729,1296,2401,4096,6561,16807,32768,59049,117649,262144,531441]

但这很慢,我之后提出的不起作用。我需要的是,根据之前的答案,它将开始测试来自n的奇数或偶数整数。我将如何从已有的东西中解脱出来?

1 个答案:

答案 0 :(得分:2)

再看一下输出。元素在奇数和偶数之间交替!

1,2,3,4,5,6,7,8,9,16,25,36,49,64,81,125,216,343,512,729,1296,2401,4096,6561,16807,32768,59049,117649,262144,531441]

在实现您要求的代码后,我注意到了这一点。它的输出与代码的输出不匹配。无论如何我会在这里发布代码:

prob63 :: [Integer]
prob63 = test 1
  where
    test s = next : test (next + 1)
      where
        next = head [n | n <- [s,s+2..], i <-[1..10], i^(length $ show n) == n]