Książka, którą czytam o Erlangu, ma ćwiczenia z tyłu i jedną jest odtworzenie list: funkcja dołączania.Jak mogę napisać listę połączeń Erlanga bez użycia modułu list?
Mogę to zrobić po prostu używając operatora ++, ale czy to nie jest naprawdę powolne? I myślę, że celem ćwiczenia jest zrobienie tego za pomocą operacji listowych, które piszę.
Dotychczas jedynym podejściem, że mogę myśleć o to, aby zrobić coś takiego:
concat([], _, Results)->
Results;
concat(_, [], Results)->
Results;
concat([Ah|At],B,Results) ->
concat(At,B,[Ah|Results]).
Ale wiem, że jest to błędne ...
jakieś sugestie, jak go o to robi?
Edycja: jest wyjaśnienie, tu przykład wejściowe i wyjściowe:
Wejście: [[1,2,3], [], [4,5], [6]] wyjściowa: [1,2,3,4,5,6] Po pracy chwilę, doszedłem
się z tym kodem, a także:
append([A|[B|[T|[]]]]) ->
append([A++B|T]);
append([H|T]) ->
H++T.
jednak to działa tylko dla gdy lista jest rozmiar 3 W jaki sposób mogę zmodyfikować to tak, aby działało dla dowolnej ilości list o losowej wielkości?
nie używam Erlang, ale nie mogę sobie wyobrazić, że 'list: append' jest szybsze niż' ++ '(myślę, że to O (n) bez względu na to, jak to robisz). – Zifre
'list: append' _is_' ++ '. –
Ale ++ może być nieefektywne, jeśli jego lewy operand jest większy niż jego prawy operand. Czy ta kara wydajności występuje również w przypadku list: append? – samoz