在Haskell中计算Mersenne数

时间:2017-11-08 17:18:21

标签: haskell

我们的任务是构建一个简单的递归函数,在Haskell中显示Mersenne number,从最小到最大的数字排序。 它基本上是2 ^ n-1 因此mersenne 7看起来像[0,1,3, 7, 15, 31, 63]

我们无法悲伤地完成它并且仍然坚持使用那段代码。

mrs :: Integer -> [Integer]
mrs 1 = [0]
mrs n = n : mrs (2^(n-1)-1)

但不知何故,这些数字正在增加,而它们应该减少,因为n越来越低。我相信它很容易解决,之后我会感到愚蠢,但就这样吧。

目前,对于输入7,它会吐出[7, 63, 46.........giant number, error]

对于输入3,它会不断吐出3[3,3,3,3...]并且低于此告诉我有关否定指数的信息。

我们对Haskell很新,所有谷歌搜索和阅读脚本都不起作用。

2 个答案:

答案 0 :(得分:4)

您需要在每次通话时减少mrs :: Integer -> [Integer] mrs 1 = [0] mrs n = (2^(n-1)-1) : mrs (n-1) > mrs 7 [63,31,15,7,3,1,0] 值,但目前正在增加它。你真正想要的可能是:

> reverse $ mrs 7
[0,1,3,7,15,31,63]

如果您想保持订单增加,只需反转列表:

https://apps.dev.microsoft.com/

答案 1 :(得分:1)

更具说明性的风格可能是定义范围[1..n],然后对其执行映射:\x -> 2^(x-1)-1

mrs n = map (\x -> 2^(x-1)-1) [1..n]

或无点的方法:

mrs n = map (subtract 1 . (2 ^) . subtract 1) [1..n]

现在,我们可以通过执行范围内的subtract 1来改善这种情况:

mrs n = map (subtract 1 . (2 ^)) [0..n-1]

这会产生:

Prelude> mrs 7
[0,1,3,7,15,31,63]