【问题标题】:How to make Haskell use another list depending on the previous answer in Haskell如何根据 Haskell 中的先前答案使 Haskell 使用另一个列表
【发布时间】:2009-10-15 09:35:56
【问题描述】:

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

x^(n) == y

其中ny 的长度。

很快就会发现这种情况的结果在奇数和偶数之间交替出现,所以我在 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

[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 的奇数或偶数。我将如何处理我已经拥有的东西?

【问题讨论】:

    标签: haskell optimization


    【解决方案1】:

    再次查看输出。元素不会在奇数和偶数之间交替!

    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]
    

    【讨论】:

    • 会不会是单对只是异常情况?
    • 不,还有一个,如您所见:59049,117649。此外,也许您应该遍历基数和幂(而不是遍历幂和 n),并确定两者的上限。这个问题有一个非常快速的解决方案。
    • 另外,似乎在学习Haskell的这个阶段,我知道需要做什么,只是我经常不知道如何实现它。我想到了一个优化,它开始搜索n的下一个值,即(current n) + (difference between current and previous )
    猜你喜欢
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    相关资源
    最近更新 更多