Haskell函数返回一个数字的所有幂,直到给定的最大值

时间:2018-04-06 20:29:35

标签: function haskell

我正在创建一个函数,它返回n的所有小于或等于max的幂。例如:powers 2 5 - > [1,2,4]。

myPowers n = n : map (* n) (myPowers n) 

powers :: Int -> Int -> [Int]
powers n max = takeWhile (< max) (myPowers n)

目前powers返回的数字太少了。例如:powers 2 6应返回3个数字,但返回2个数字。

1 个答案:

答案 0 :(得分:4)

问题是,您的myPowers功能以n开头,而不是1。例如:

Prelude> take 10 $ myPowers 2
[2,4,8,16,32,64,128,256,512,1024]

我们可以通过以下方式解决此问题:

myPowers n = 1 : map (* n) (myPowers n)

请注意,您可以使用iterate :: (a -> a) -> a -> [a]提高计算效率,因此您可以将其定义为:

myPowers n = iterate (n*) 1

如果你想要允许等于的权力到边界,你应该检查<=的界限:

powers n max = takeWhile (<= max) (myPowers n)

然后我们获得样本输出,如:

Prelude> powers 2 5
[1,2,4]
Prelude> powers 2 6
[1,2,4]
Prelude> powers 2 10
[1,2,4,8]
Prelude> powers 3 10
[1,3,9]
Prelude> powers 3 30
[1,3,9,27]
Prelude> powers 5 30
[1,5,25]