我有一个Erlang项目需要生成一个数组索引的嵌套列表。也许使用arrays:
会是一个快速的解决方案,但是我想看看没有那个模块是如何完成的。
如果知道数组的维数,创建数组索引的嵌套列表可以在一行中完成。
array2Dim(M,N) -> [[[X,Y] || X <- lists:seq(1,N)] || Y <- lists:seq(1,M)].
我一直在努力实现一个函数,比如arrayNDim/1
,它将获取一个未知长度的包含维度的列表[D1,D2,..., Dn]
,以生成D1 x D2 x...,Dn
数组的索引。
我曾考虑过将产卵过程作为一个“齿轮系”来产生结构,但我怀疑解决方案可能要简单得多。
1条答案
按热度按时间u2nhd7ah1#
最明显的解决方案是使用列表
[1,...,D1], [1..,D2],...,[1...Dn]
的笛卡尔积。正如问题中的笛卡尔积在列表解析中很容易,但只有当因子的数量已知时才是直接的。我最终做的是写一个广义外积函数outer/3
,它以两个列表和一个乘积函数作为参数。通过取fun(X,Y) -> [X,Y] end
作为乘积,并明智地使用lists:flatten/2
,我们 * 几乎 * 得到笛卡尔积。我说 * 几乎 * 是因为结果不是坐标树,而是坐标的扁平列表[[1,..,1],[1,..,2],...]
。对于我的目的来说,这就足够了。其他有趣的解决方案(我还没有完全实现这些作为练习)是:使用一系列进程,每个进程都显示一个计数器,如问题中所示;以及充分利用Erlang的函数特性,从模板中生成类似于嵌套
for
循环的函数。