Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Во-первых, нельзя запустить loop() перед spawn_link(). Казалось бы, так будет более надежно, т.к. функция-слушатель, запущенная до запуска потока-исполнителя, наверняка не пропустит ни одного сообщения от этого потока.O_o
loop()
перед spawn_link()
???++
на больших списках не стоит, т.к. левый операнд целиком копируется за O(n)
[NewEl | Accumulator]
и lists:reverse
в конце, либо [List1, List2]
и lists:flatten
в конце> erlang:is_builtin(lists, reverse, 2).
true
map([], Acc, _) ->
Acc;
map([Element | Elements], Acc, F) ->
map(Elements, Acc ++ [F(Element)], F).
( O(n^2) если не ошибаюсь)map([], Acc, _) ->
Acc;
map([Element | Elements], Acc, F) ->
map(Elements, [F(Element)|Acc], F).
concat() ->
lists:foldl(fun(I, A) -> A ++ [I] end, [], lists:seq(1,1000)).
concat2() ->
R = lists:foldl(fun(I, A) -> [I|A] end, [], lists:seq(1,1000)),
lists:reverse(R).
Отметим два неочевидных обстоятельства. Во-первых, нельзя запустить loop() перед spawn_link(). Казалось бы, так будет более надежно, т.к. функция-слушатель, запущенная до запуска потока-исполнителя, наверняка не пропустит ни одного сообщения от этого потока. Но опыт показывает, что в этом случае функция-слушатель вообще не получает сообщения от потока-исполнителя. По-видимому, это связано с тем, что статус отношения потоков не обновляется.
я как истинный нуб в Эрланге предположил и попробовал.
perms([]) -> [[]];
perms(L) -> [[H|T] || H <- L, T <- perms(L--[H])].
factorial(0) -> 1;
factorial(N) ->N * factorial(N-1).
sort([Pivot|T]) ->
sort([ X || X <- T, X < Pivot]) ++
[Pivot] ++
sort([ X || X <- T, X >= Pivot]);
sort([]) -> [].
factorial(N) -> factorial(N, 1).
factorial(0, Acc) -> Acc;
factorial(N, Acc) -> factorial(N-1, Acc*N).
tc(F) ->
Before = os:timestamp(),
Val = F(),
After = os:timestamp(),
{now_diff(After, Before), Val}.
github.com/erlang/otp/blob/OTP_R15B03-1/lib/stdlib/src/timer.erl#L177std::vector<std::vector<int>> all_permutations( std::vector<int> v )
{
std::vector<std::vector<int>> ret;
do {
ret.push_back(v);
} while( std::next_permutation( begin(v), end(v)) );
return ret;
}
{
std::vector<int> v{0,1,2,3,4,5,6,7,8,9};
do {
// do something useful
} while( std::next_permutation( begin(v), end(v)) );
return ret;
}
Учимся думать и писать на Erlang (на примере двух комбинаторных задач)