Простое решение:
take([H|T], N) when N > 0 ->
[H|take(T, N-1)];
take(_, 0) -> [].
Это приведет к ошибке, если в списке недостаточно элементов.
Когда вы используете аккумулятор, как вы делаете, вы обычно не добавляете элементы в его конец, так как это очень неэффективно (вы копируете весь список каждый раз). Обычно вы добавляете к нему элементы с помощью [H|List]
. Тогда он будет в обратном порядке, но затем вы делаете lists:reverse(List)
, чтобы вернуть их в правильном порядке.
take(List, N) -> take(List, N, []).
take([H|T], N, Acc) when N > 0 ->
take(T, N-1, [H|Acc]);
take(_, 0, Acc) -> lists:reverse(Acc).
Аккумуляторная версия - хвостовая рекурсия , что хорошо, но вам нужно сделать дополнительный реверс, который устранит некоторые из преимуществ. Первая версия, я думаю, более понятна. Нет четкого обоснования для любого из них.