我们的任务是构建一个简单的递归函数,该函数在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]