Первая функция быстрее, потому что вы вычисляете только верхнее число один раз. Во второй функции вы создаете все числа от 2 до квадратного корня плюс один. Это 20096056 целых чисел в списке.
lists:seq(2, round(math:sqrt(Val)) % Creates a list from 2 to 20096056
Ваша проблема не подходит для решения, которое создает все пространство поиска в памяти по причинам, связанным с пространством и производительностью.
В заключение, использование списков здесь очень неоптимально.
Что касается соглашений об именовании: когда функция имеет другую арность (другое количество аргументов), обычно ее называют одинаковой. Эрланг не видит ее как одну и ту же функцию, хотя, только функции с одинаковым именем и арностью считаются равными.
find_factors(Val)-> find_factor_rec([], round(math:sqrt(Val)) + 1, Val, 2).
find_factors(List, Max, _, NextValue) when NextValue > Max ->
List;
find_factors(List, Max, Value, NextValue) ->
if
(Value rem NextValue =:= 0) ->
find_factors([NextValue|List], Max, Value, NextValue + 1);
true ->
find_factors(List, Max, Value, NextValue + 1)
end.