我是Erlang的新手,我试图理解为什么递归比使用列表更快(甚至可能会出现“无法在堆中分配内存”的错误)。
我创建了两个函数来查找给定值的质数(非常直观):
using recursion:
find_factor_rec(List, Max, _, NextValue) when NextValue > Max -> List; find_factor_rec(List, Max, Value, NextValue)-> if (Value rem NextValue =:= 0) -> find_factor_rec([NextValue|List], Max, Value, NextValue + 1); true -> find_factor_rec(List, Max, Value, NextValue + 1) end . find_factors(Val)-> find_factor_rec([], round(math:sqrt(Val)) + 1, Val, 2).
list
find_factors1(Val) -> [X || X <- lists:seq(2, round(math:sqrt(Val)) + 1), Val rem X =:= 0].
当我传递小值时,两个函数同时执行。但是当我传递像403851455234578这样的巨大值时,第二个函数变得越来越慢,甚至会抛出错误。
请问有人能解释为什么第一个函数比列表更好吗?有没有更好的重写函数的方法?第一个列表是否有任何命名约定(函数加上它们的“子递归函数”)?
谢谢。