输出一系列因子的函数

时间:2018-05-21 10:36:32

标签: list haskell

对于作业,我需要创建一个函数,该函数获取Int的列表并在新列表中输出所有数字的因子。事情是,我完全不知道该怎么做。我知道它的签名需要像这样:

factors :: [Int] -> [[Int]]
factors xs = ???

所以当你选择这样的列表时:[2,5,7,8]

输出[[],[],[],[2,4]]

我尝试了地图,过滤器,模组,列表理解或更高阶函数,但由于这是我学习的第一种语言,因此我很难想出任何解决方案。

1 个答案:

答案 0 :(得分:3)

因此,如果我们遇到困难,首先要做的就是跳过问题的编程部分,然后从解决实际问题开始。我们想获取1个数字,得到该数字的因子,将因子包装在列表中,并继续前进,直到没有更多的数字来计算。

那么我们如何得到一个数字的因子?如果我们可以将y写为x和其他整数z的乘积,则数x是y的因子。因此,2是因子8,因为8可以写为2 * 4。

使用这些信息我们也知道8必须在没有休息的情况下被2分割,这就是它。大!所以知道我们知道对于任意两个整数x和y,如果x可以被y整除而没有休息,则y是一个因子。

让我们去哈斯克尔并尝试一些方法来获取信息:"如果y除以x而没有休息,则x是y的因子,

factors :: Int -> [Int]
factors y = [ x | x <- [1..y], y `mod` x == 0]

因此,使用listcomp我们可以将[1..y]中的所有x:es包装起来并将它们放在列表中,但是当且仅当

y 'mod' that specific x equals 0

如果我们有一个函数来创建一个包含一个数字的所有因子的列表,那么如果我们只是将该函数映射到一个数字列表,并将结果列表包装在一个新列表中,然后返回该列表

listFactors :: [Int] -> [[Int]]
listFactors xs = map factors xs

如果我们不想显示乘法标识1或数字本身,我们只需将间隔更改为[2..y-1]