Как я могу написать список Erlang, конкатенируют, не используя модуль списков?

Как любой проект, устанавливающий buildevents, может быть настроен на Конфигурацию, просто выбрать конфигурацию, которую Вы хотите изменить в выпадающем из диалогового окна Страниц свойств и отредактировать шаг

сборки сообщения
10
задан samoz 15 July 2009 в 13:15
поделиться

3 ответа

Вам нужны только два параметра для вашей функции concat, так как вы будете добавлять к одному из параметров, и это то, что вы в конечном итоге вернете. Что-то вроде (непроверено):

concat(L,[]) ->
   L;
concat(L,[H|T]) ->
   concat(L ++ [H],T).

++ - это оператор добавления, вам нужно будет сделать это, чтобы быть эффективным.

(Идея вышеизложенного - вернуть левый параметр, если у нас нет больше влево или вызовите снова после перемещения одного из элементов справа налево). Вероятно, будет больше эффективности при добавлении в обратном порядке, а затем, наконец, в изменении ответа, но эй ...)

(Только что видел ваше редактирование, и мое, конечно, работает только для двух добавляемых вещей, но вы можете рекурсивно повторить приведенное выше функция для каждого элемента в вашем списке списков ...)

4
ответ дан 3 December 2019 в 18:00
поделиться

++ медленно работает только при неправильном использовании, при осторожном использовании он так же быстр, как и все, что вы можете создать вручную. Вы должны убедиться, что работаете со списком в правильном направлении, иначе полученное добавление будет O (N ^ 2). Когда мы выполняем X ++ Y, мы должны сделать копию X, а затем добавить ее к Y, который не копируется.

В этой функции аккумулятор появляется в левой части ++, поэтому добавление неэффективно.

concatl(Lst) ->
    concatl(Lst, []).
concatl([], Acc) ->
    Acc;
concatl([H|T], Acc) ->
    concatl(T, Acc ++ H).

Эта функция работает намного лучше, даже несмотря на то, что она не хвостовая рекурсивная.

concat([]) -> [];
concat([H|T]) ->
    H ++ concat(T).

В этом случае переписывание в хвостовую рекурсию является лишь скромным улучшением:

concat2(Lst) ->
    concat2(lists:reverse(Lst), []).
concat2([], Acc) -> Acc;
concat2([H|T], Acc) ->
    concat2(T, H ++ Acc).

Тайминги в большом списке ввода показывают, насколько велик улучшение есть. (Время в микросекундах.)

41> Time(fun() -> test:concatl([lists:seq(1,1000) || X <- lists:seq(1,1000)]) end).
14539061
40> Time(fun() -> test:concat([lists:seq(1,1000) || X <- lists:seq(1,1000)]) end).
245356
42> Time(fun() -> test:concat2([lists:seq(1,1000) || X <- lists:seq(1,1000)]) end).
211571
14
ответ дан 3 December 2019 в 18:00
поделиться

Один из лучших подходов - использовать списки: foldr ,

concat(A,B) ->
    lists:foldr(fun(X,XS) -> [X|XS] end, B, A).

concat(XS) ->
    lists:foldr(fun concat/2, [], XS). 

Это также хорошее упражнение для написания собственной функции foldr ...

4
ответ дан 3 December 2019 в 18:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: