访问列表中元素的两个邻居

我正在尝试在 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 - 1x、来遍历列表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


以上是访问列表中元素的两个邻居的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>