当前位置:  开发笔记 > 编程语言 > 正文

haskell中的圆形地图

如何解决《haskell中的圆形地图》经验,为你挑选了1个好方法。

我的任务是实现一个返回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> beoliver..:

据我所知......

我刚刚写了一个简单的翻转函数,它将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]

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有