如何在erlang中打印出2D数组的元素

时间:2015-10-02 04:32:02

标签: arrays recursion printing count erlang

我一直试图在erlang中打印出2D数组的元素,但是,由于没有循环,因此没有简单的方法来增加变量,更不用说两个了。我已经看过一个或两个用于创建单个循环的递归函数,但是,我无法将此代码转换为嵌套循环。这是我一直在使用的代码。

-module(test2). 
-export([do_loop/0,loop/1]).

do_loop() ->
    loop(0).

loop(10) ->
    ok;
loop(Count) ->
    io:format("~w~n", [Count]),
    loop(Count+1).

感谢任何帮助!

编辑: 这是数组的代码

create( X, Y ) -> array:new( [{size, X}, {default, array:new( [{size, Y}] )}] ).

get( X, Y, Array ) -> array:get( Y, array:get(X, Array) ).

1 个答案:

答案 0 :(得分:1)

阵列模块提供foldlfoldr以将数组从低到高和从高到低折叠。

使用foldl并递归到二级数组(及其后):

-module(test).
-export([dump/1]).

dump(Array) ->
    array:foldl(fun inner_dump/3, [], Array).

dump函数接受数组并启动折叠。 array:foldl采用折叠函数,初始累加器和数组进行折叠。它依次获取数组的每个元素并调用FoldFun(Index, Element, Accumulator),该调用的返回值成为新的累加器。对于此函数,我已将累加器定义为父数组的索引列表。

inner_dump( Index, ArrayOrElement, Previous) ->
    case array:is_array(ArrayOrElement) of
        false ->
            io:format("~p ~p~n", [lists:reverse([Index|Previous]), ArrayOrElement]),
            Previous;
        true ->
            array:foldl(fun inner_dump/3, [Index|Previous], ArrayOrElement),
            Previous
    end.

这是折叠功能。如果传递的元素不是数组,则将其索引添加到父索引列表中,然后反转该列表并使用该元素打印它。 (这给出了每个数组的索引从最外层开始,如预期的那样)

如果传递的元素是子数组,则将其索引添加到父索引列表中,并以相同的方式折叠它。

这将允许您打印出任意深度的数组,即使每个子数组的大小不同,它仍然可以正常工作。

以下是使用数组[[a,b,c],[1,2,3],["yes","no","maybe"]]的示例:

2> Array.
{array,3,0,undefined,
       {{array,3,10,undefined,
               {a,b,c,undefined,undefined,undefined,undefined,undefined,
                  undefined,undefined}},
        {array,3,10,undefined,
               {1,2,3,undefined,undefined,undefined,undefined,undefined,
                undefined,undefined}},
        {array,3,10,undefined,
               {"yes","no","maybe",undefined,undefined,undefined,undefined,
                undefined,undefined,undefined}},
        undefined,undefined,undefined,undefined,undefined,undefined,
        undefined}}
3> test:dump(Array).
[0,0] a
[0,1] b
[0,2] c
[1,0] 1
[1,1] 2
[1,2] 3
[2,0] "yes"
[2,1] "no"
[2,2] "maybe"
[]