0

我需要创建一个函数“powers”,它接受一个数字 n 并将该数字的无限列表返回到每个数字的幂,例如

powers 2 = 2,4,8,16,32......

我需要使用非常特定的语言子集来执行此操作,其中我唯一可用的内置函数是:div、mod、even、odd、head、tail、not、null、length、reverse、elem、map、filter、foldr、sum , product, take, drop, takewhile, dropWhile, zipWith 和 from。

该子集也没有 ^ 运算符。

还有一些更重要的限制:

  • 代码不得超过 1 行,长度超过 80 个字符
  • 不允许使用“辅助函数”,即我不能编写另一个函数以在此定义中使用。

到目前为止,我的想法是沿着这些思路:

powers = \n -> map (\x -> "some function to get n to the power of x") (from 1)

但我无法弄清楚如何在没有辅助函数的情况下让函数执行此操作。

例如,如果我要使用返回数字 x 的无限列表的函数 inflist,那么我可以执行以下操作。

powers = \n -> map (\x -> product(take x (inflist n))) (from 1)

但我不能这样做或任何类似的事情,因为我不能使用那个功能。

抱歉,如果符号与普通的 haskell 不同,它是使用此符号的非常严格的核心 haskell 子集。

4

2 回答 2

3

这是一个递归问题。

powers n = n : map (* n) (powers n)

(你可以使用:吗?)

于 2012-11-21T07:42:55.923 回答
0

当洞察力来临时,这很有趣。在列表中生成连续更长的 2 重复

[ [ 2 | y <- [1..x]] | x <- [1..]]

然后取每个列表的乘积。

map product [ [ 2 | y <- [1..x]] | x <- [1..]]

一定要在调用之前使用 take x ,因为我使用一个 mod 和多个 mod 函数来限制列表。

如果允许迭代。

take 24 $ iterate (2*) 2

将生成列表。

编辑 2018 年 4 月 4 日

一个无限递归函数,可能是您要填写函数的内容。有可能:

pow l = l ++ pow [(last l * 2)]

要生成一个列表,绝对有必要组装一个列表,并且必须使用列表的最后一个元素来计算序列中的下一个元素。这也必须与 take 一起运行。以下命令也以 1 开始列表。它可以以任何数字开始,例如 64 或 63。我尝试将最后一个值作为参数传递,但函数不会生成列表。有一个选择,使用 ':' 而不是 '++' 但它会生成列表中的每个元素。要生成值列表而不是列表列表,请在 'take' 之前使用 'concat $' 来清理它。

take 10 $ pow [1]
于 2018-04-01T02:48:38.010 回答