1
listX n = xs
if sum[x | x <- [2, 4..n-1], y <- [1..n-1], y `rem` x == 0] == y
    then insert y xs
    else return ()

好吧,第一次尝试使用 Haskell,并且只有新手 Java 知识导致了一些问题。我试图做的是将函数 listX n 的结果定义为一个名为 xs 的列表。我的想法是程序会抓取从 1 到 n 的每一个数字,并检查它是否等于其正除数的总和。显然,我失败了,需要帮助,非常感谢我不理解的概念的指针。

4

1 回答 1

3

您的主要问题似乎是您仍然认为势在必行(使用insert)-也是()单位-您可能想改写[](空列表)-但xs此处仍然完全未定义,因此您也必须解决此问题(而且我不知道如何诚实)。

完美数字

我想我可以在那里看到一个基本的想法,我认为解决这个问题的最好方法是进行完整的列表理解(因为你似乎很好地理解了它们) - 这是一个应该工作的版本:

listX n = [ x | x <- [1..n], sum [ y | y <- [1..x-1], x `mod` y == 0] == x]

如您所见,我对此进行了一些更改-首先我检查所有x1n是否可以完美-我通过总结所有适当的除数并检查总和是否等于来做到这一点x(这就是sum [...] == x部分的工作) - 如果您不知道这是有效的,因为您可以在列表推导中添加警卫(sum [..] == x过滤掉所有符合条件的值x)。

更好的版本

为了使它更具可读性(并分离关注点),我建议这样写:

properDivisors :: Integer -> [Integer]
properDivisors n = [ d | d <- [1..n-1], n `mod` d == 0]

isPerfect :: Integer -> Bool
isPerfect n = sum (properDivisors n) == n

perfectNumbers :: [Integer]
perfectNumbers = filter isPerfect [1..]

perfectNumbersUpTo :: Integer -> [Integer]
perfectNumbersUpTo n = takeWhile (<= n) perfectNumbers
于 2015-10-06T14:01:12.920 回答