我需要创建一个带有数字n的函数“powers”,并将该数字的无限列表返回给每个数字的幂。例如。
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 and from。
该子集也没有^运算符。
还有一些重要的限制因素:
到目前为止,我的想法是这样的:
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子集,它使用这种表示法。
答案 0 :(得分:3)
这是一个递归问题。
powers n = n : map (* n) (powers n)
(您是否可以使用:
?)
答案 1 :(得分: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
会生成列表。
编辑4/4/2018
无限的递归函数,可能就是您要填写的功能。它可能是:
pow l = l ++ pow [(last l * 2)]
要生成列表,必须组装一个列表,并且必须使用列表的最后一个元素按顺序计算下一个元素。这也必须与take一起运行。此外,以下命令以1开始列表。它可以使用任何数字(例如64或63)启动。我尝试将最后一个值作为参数传递但是该函数不会生成列表。有一个选择,使用':'而不是'++',但它会在列表中生成每个元素。要生成一个值列表而不是在'take'之前使用'concat $'的列表列表来清理它。
take 10 $ pow [1]