Создание списка в Erlang - PullRequest
       36

Создание списка в Erlang

5 голосов
/ 20 ноября 2010

Из упражнения «Программирование Эрланга» Чезарини 3-2

Когда я прохожу «Программирование Эрланга», у меня возникают странные проблемы с созданием списков.Из упражнения 3-2 я написал две аналогичные функции.

create( 0 ) -> [];
create( N ) when N > 0 -> [ N | create( N-1 ) ].

reverse_create( 0 ) -> [];
reverse_create( N ) when N > 0 -> [ reverse_create( N-1 ) | N ].

, поэтому create (3) генерирует, как я ожидал.

упражнение 3: создать (3).[3,2,1]но reverse_create не генерирует ожидаемый список.

упражнение 3: reverse_create (3).[[[[] | 1] | 2] | 3]

Что мне нужно изменить, чтобы reverse_create (3) вернул [1,2,3]?Спасибо за объяснение.

Ответы [ 5 ]

5 голосов
/ 20 ноября 2010

reverse_create возвращает список, и вы используете его в качестве элемента head для создания списка, в результате которого создаются вложенные списки Попробуйте это решение:

reverse_create( 0 ) -> [];
reverse_create( N ) when N > 0 -> reverse_create( N-1 ) ++ [N].

РЕДАКТИРОВАТЬ: гораздо лучшая реализация будет:

reverse_create2(N) -> reverse_create_helper(N, []).

reverse_create_helper(0, Acc) ->
    Acc;
reverse_create_helper(N, Acc) ->
    reverse_create_helper(N-1, [N|Acc]).
3 голосов
/ 21 ноября 2010

Обычно такая функция, как reverse_create, выполняется с хвостовой рекурсией с аккумулятором.

reverse_create(N) ->
    reverse_create(N, []).

reverse_create(0, Acc) ->
    Acc;
reverse_create(N, Acc) when N > 0 ->
    reverse_create(N - 1, [N | Acc]).
2 голосов
/ 20 ноября 2010

Конечно, вы всегда можете сделать:

reverse_create(N) -> lists:reverse(create(N)).

Это на самом деле будет работать быстрее. Но это явно не цель упражнения. :)

1 голос
/ 10 ноября 2011

Я читаю ту же книгу, поэтому я не более опытный, чем вы, но у меня это сработало ...

create(0) -> [];
create(N) when N > 0 -> create(N-1) ++ [N].

reverse_create(0) -> [];
reverse_create(N) when N > 0 -> [N|create(N-1)].
0 голосов
/ 11 сентября 2013

Это



    reverse_create(0) -> [];
    reverse_create(N) ->
        list_create_1(1, N, []).

    list_create_1(I, N, List) when N >= I ->
        list_create_1(I + 1, N, [I | List]);
    list_create_1(_, _, List) -> List.


...