Elixir循环遍历矩阵

时间:2017-10-04 18:02:59

标签: recursion matrix erlang elixir

我有一个元素列表,我正在使用Enum.chunk_every方法将其转换为列表列表。

代码是这样的:

matrix = Enum.chunk_every(list_1d, num_cols)
Now I want to loop over the matrix and access the neighbors

如果我有列表[1,2,3,4,5,6,1,2,3],它就会转换成3X3矩阵,如:

[[1,2,3],[4,5,6],[1,2,3]]

现在我如何循环这个矩阵?如果我想访问元素的邻居怎么办?例如,5的邻居是2,4,6和2。

我可以看到递归是一种可行的方式,但这将如何运作?

1 个答案:

答案 0 :(得分:0)

有很多方法可以解决这个问题,我认为您应该首先考虑您的用例(矩阵的大小,矩阵的数量,访问次数......)并相应地调整您的数据结构。

尽管如此,这是一个简单的实现(在Erlang shell中,我让你适应elixir):

1> L = [[1,2,3], [4,5,6], [1,2,3]].
[[1,2,3],[4,5,6],[1,2,3]]
2> Get = fun(I,J,L) -> 
            try
               V = lists:nth(I,lists:nth(J,L)),
               {ok,V}
            catch
               _:_ -> {error,out_of_bound}
            end
          end.
#Fun<erl_eval.18.99386804>
3> Get(1,2,L).
{ok,4}
4> Get(2,3,L).
{ok,2}
5> Get(2,4,L).     
{error,out_of_bound}
6> Neighbor = fun(I,J,L) ->
                [ V || {I1,J1} <- [{I,J-1},{I-1,J},{I+1,J},{I,J+1}],
                       {ok,V} <- [Get(I1,J1,L)]
                ]
              end.                 
#Fun<erl_eval.18.99386804>
7> Neighbor(2,2,L).                                                                                            
[2,4,6,2]
8> Neighbor(1,2,L).
[1,5,1]
9>

备注:我喜欢列表理解,您可能更喜欢使用列表:在这种情况下使用map。此代码效率不高,因为它解析列表4次以获取邻居。唯一的好处是它是直的&#34;。所以应该很容易阅读。