Нет, использование Acc
не делает его рекурсивным.Ваша ветвь if возвращает [H| remove(T, Key, Acc)]
, который не является хвостовым вызовом, и эта ветвь будет использоваться большую часть времени.Если быть более точным, то использование Acc
бесполезно, потому что это будет []
все время, вы вообще не меняете его значение.Правильный код должен выглядеть следующим образом.
delete(Key, Database) ->
remove(Database, Key, []).
remove([], Key, Acc) ->
lists:reverse(Acc);
remove([H|T], Key, Acc) ->
if
element(1, H) /= Key ->
remove(T, Key, [H|Acc]);
true ->
remove(T, Key, Acc)
end.
Но если члены вашего списка всегда являются парами, я бы предпочел прямое сопоставление с шаблоном:
delete(Key, Database) ->
remove(Database, Key, []).
remove([], Key, Acc) ->
lists:reverse(Acc);
remove([{Key, _}|T], Key, Acc) ->
remove(T, Key, Acc);
% if it should delete only first occurrence then lists:reverse(Acc, T);
remove([H|T], Key, Acc) ->
remove(T, Key, [H|Acc]).
Но я думаю, что это пример, где можно применить Миф: Хвост-рекурсивные функции НАМНОГО быстрее, чем рекурсивные функции , поэтому я бы использовал гораздо более простую рекурсивную версию:
delete(Key, []) -> [];
delete(Key, [{Key, _}|T]) -> delete(Key, T);
% if it should delete only first occurrence then just T;
delete(Key, [H|T]) -> [H | delete(Key, T)].