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 -> Int -> 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 - 寻找整数的除数的主要内容,如果未能解决你的问题,请参考以下文章