我正在创建一个函数,它返回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个数字。
答案 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]