Как любой проект, устанавливающий buildevents, может быть настроен на Конфигурацию, просто выбрать конфигурацию, которую Вы хотите изменить в выпадающем из диалогового окна Страниц свойств и отредактировать шаг
сборки сообщенияВам нужны только два параметра для вашей функции concat, так как вы будете добавлять к одному из параметров, и это то, что вы в конечном итоге вернете. Что-то вроде (непроверено):
concat(L,[]) ->
L;
concat(L,[H|T]) ->
concat(L ++ [H],T).
++ - это оператор добавления, вам нужно будет сделать это, чтобы быть эффективным.
(Идея вышеизложенного - вернуть левый параметр, если у нас нет больше влево или вызовите снова после перемещения одного из элементов справа налево). Вероятно, будет больше эффективности при добавлении в обратном порядке, а затем, наконец, в изменении ответа, но эй ...)
(Только что видел ваше редактирование, и мое, конечно, работает только для двух добавляемых вещей, но вы можете рекурсивно повторить приведенное выше функция для каждого элемента в вашем списке списков ...)
++ медленно работает только при неправильном использовании, при осторожном использовании он так же быстр, как и все, что вы можете создать вручную. Вы должны убедиться, что работаете со списком в правильном направлении, иначе полученное добавление будет 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
Один из лучших подходов - использовать списки: foldr
,
concat(A,B) ->
lists:foldr(fun(X,XS) -> [X|XS] end, B, A).
concat(XS) ->
lists:foldr(fun concat/2, [], XS).
Это также хорошее упражнение для написания собственной функции foldr ...