我们的任务是构建一个简单的递归函数,该函数在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来说,我们还很陌生,所有的Google搜索和脚本阅读都无法正常进行。

最佳答案

您需要在每次通话时减小n值,但当前正在增加它。您真正想要的可能是:

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]

09-28 03:28