Haskell - 寻找整数的除数

Posted

技术标签:

【中文标题】Haskell - 寻找整数的除数【英文标题】:Haskell - Finding Divisors of an Integer 【发布时间】:2012-01-31 20:48:04 【问题描述】:

根据这本书,这就是它的完成方式,但我无法让它发挥作用。它给了我一个错误不在范围内:'ld'。我猜我应该导入一些包,但不确定是哪个包。此外,本书在提示符处使用 GS 模块,但我使用的是具有 Prelude 的 WinGHCi。我在这里错过了什么?

factors :: Int -> [Int]
factors n | n < 1 = error "not positive"
          | n == 1 = []
          | otherwise = p : factors (div n p)
                        where p = ld n

我想这也可以使用 map 和 filter 函数来完成?怎么样?

【问题讨论】:

您应该重新表述您的问题,以明确您遇到的具体问题,以便我们给您适当的提示。 还是不太好。首先考虑除数。除数 n 的结果代表什么?您将如何手动计算它们?你能把它翻译成 Haskell 代码吗?部分? 确实如此:“素数 n 是一个只有 1 和 n 的除数的数”。 n=1 可以被 1、n(在这种情况下等于 1)整除,除此之外没有其他任何东西。所以根据这个定义,1 将是一个素数。 @iPC - 如果你愿意提供一个完善的英文解决方案,我相信这里的人会很乐意将它翻译成 Haskell。但问题显然是,你根本不知道“k 除 n”是什么意思 @iPC - 看看第 5 页的顶部。你在那里看到了什么? 【参考方案1】:

将其分解为更简单的步骤。

写一个函数,divides :: Int -&gt; Int -&gt; Bool 这样

x `divides` n
当 x 是 n 的除数时

为真。所以,首先,想想x 成为n 的除数意味着什么。

既然您有办法检查单个数字x 是否是n 的除数,那么您需要检查小于n 的某个范围的数字以查看哪些数字是除数。

提示:在 Haskell 中,您可以生成从 1 到 n 的数字列表,如下所示:[1..n]

这就是你提到的filter 函数有用的地方。检查它的类型:

filter :: (a -> Bool) -> [a] -> [a]  

只需将上面的a 替换为Int

isPrime 函数而言,只要想一想数字为质数意味着什么...如果您正确计算了除数,则可以检查列表以确保它与该属性匹配.

如果这个与家庭作业相关的问题,你绝对应该用家庭作业来标记它,那么人们就不会因为提供帮助而感到胆怯:)

【讨论】:

【参考方案2】:

我想这个作业的目的是教你列表推导、filter 和类似的构造,而不是让你编写测试素数的函数或以任何合理的方式创建除数列表。因此你需要的是一个谓词divides

divides :: Int -> Int -> Bool
a `divides` b = ???

然后,您使用该谓词作为 filter 的参数或在列表推导中查找除数列表,并为您的 isPrime 测试使用 divisors 函数。

【讨论】:

【参考方案3】:

你想检查从 1 到 n 的所有数字,并且只有当它们除以 n 时才保留它们。 filter 函数可以帮助您:

divisors n = filter ??? [1..n]

那么你需要用什么条件代替???

对于isPrime 函数,您可以重复使用divisors 函数,您已经提到了如何使用。

【讨论】:

以上是关于Haskell - 寻找整数的除数的主要内容,如果未能解决你的问题,请参考以下文章

寻找可以处理 Haskell 的网络主机 [关闭]

如何在 Haskell 中解析整数矩阵?

Haskell:读取一个数字(整数或浮点数)

Haskell检查函数是不是两次返回相同的值

Haskell中是否有“继续”?

在 Haskell 中将字符串转换为整数/浮点数?