访问列表中元素的两个邻居
我正在尝试在 haskell 中实现 Wolfram 的基本元胞自动机(规则 30)。
结果为./wolfram 10:
*
***
** *
** ****
** * *
** **** ***
** * * *
** **** ******
** * *** *
** **** ** * ***
首先,我生成这个列表:[0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0]其中 0 是' '1 是'*'。
将此列表传递给函数genNextLine :: [Int] -> [Int]将生成下一个列表。
对于给定的元素,下一个元素由它的两个邻居决定(例如:[0, 1, 1]将生成一个1)。
我可以像这样逐个元素地遍历列表:
genNextLine :: [Int] -> [Int]
genNextLine (x : xs) = ...
但是如何通过访问元素x - 1、x、来遍历列表x + 1?
回答
您可以对需要的任何长度的前缀使用模式匹配:
genNextLine :: [Int] -> [Int]
genNextLine (x1:x2:x3:xs) = (doSomethingWith x1 x2 x3):(getNextLine $ (x2:x3:xs))
genNextLine (x1:xs) = (x1:xs)
顺便说一句,如何使用zipWith3?
genNextLine :: [Int] -> [Int]
genNextLine (x1:x2:xs) = zipWith3 doSomethingWith (x1:x2:xs) (x2:xs) xs