2015-10-02 2 views
1

Я пытался распечатать элементы 2D-массива в erlang, однако, поскольку нет циклов, и поэтому нет простого способа увеличения переменной, не говоря уже о том, что два. Я видел одну или две рекурсивные функции для создания одного цикла, однако мне не удалось превратить этот код в вложенный цикл. Это код, который я использовал.Как распечатать элементы 2D-массива в erlang

-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). 

Любая помощь приветствуется!

EDIT: Вот код для массива

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

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

ответ

2

Модуль обеспечивает массив foldl и foldr складывать над массивом от низкого до высокого и высокого до низки, соответственно.

Используя foldl и рекурсии в массивы второго уровня (и далее):

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

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

Функция сброса принимает массив и начинает складку. 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" 
[] 
+0

Это работало отлично, спасибо! –

Смежные вопросы