我的任务是实现一个返回Thue-Morse序列的函数.我通过原始递归完成了它,但现在我必须使用循环列表(使用列表理解),并且当我调用它时它必须返回它:
>take 4 thueSeq [[0],[0,1],[0,1,1,0],[0,1,1,0,1,0,0,1]]
这是我(可怕的)实施尝试:
> thueSeq = 0: [x | x <- zipWith (mod) (tail thueSeq) [1] ]
我立即意识到这是错误的(头部应该是[0],而不是0)但是写作[0] ++ [0,1] ++ ...
并没有返回列表列表.
我的问题是,首先,我怎么"开始"与列表[[0],[0,1]]
,因为从我所用的圆形表看到,他们有基础的情况下,然后通过递归.其次,我的列表理解试图适用(mod x 1)
于每个值,但这也是错误的,因为它[[0,1]]
会变成[[0,1,0]]
而不是[[0,1,1,0]]
.所以我想我必须将它应用于列表中的每个其他元素(第1个元素,第3个,第5个等)?
据我所知......
我刚刚写了一个简单的翻转函数,它将1到0和0映射到1
flipBit 1 = 0 flipBit 0 = 1
该函数h
接受一个列表,并将该列表与列表的翻转版本连接起来
h xs = xs ++ (map flipBit xs) *Main> h [0] [0,1]
main函数fseq
将列表作为参数.它将参数转化为递归调用
fseq xs = xs : fseq (h xs) *Main> take 4 $ fseq [0] [[0],[0,1],[0,1,1,0],[0,1,1,0,1,0,0,1]]
Haskell提供了iterate :: (a -> a) -> a -> [a]
完成此功能的功能.
我们现在可以将其包装如下:
thue_morse = fseq [0]
或使用该功能 iterate
thue_morse = iterate h [0]
两者都给出了结果
*Main> take 4 thue_morse [[0],[0,1],[0,1,1,0],[0,1,1,0,1,0,0,1]]
如果你想使用列表推导,你可以写这样的东西:
h xs = xs ++ (map flipBit xs) thue_morse = [0] : [ h x | x <- thue_morse]