我们的任务是构建一个简单的递归函数,在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很新,所有谷歌搜索和阅读脚本都不起作用。
答案 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]