我想找到一个数字的主要因素。我写:
defmodule Prime do
def factors(n) when is_integer(n) and n > 1 do
Stream.unfold(n, fn 1 -> nil; n -> &({&1, div(n, &1)}).(lf n) end) |> Enum.to_list
end
def lf(n) when is_integer(n) and n > 1 do
if rem(n, 2) == 0 do 2
else Stream.iterate(3, &(&1 + 2)) |> Stream.filter(&(rem(n, &1) == 0))
|> Stream.take(1) |> Enum.to_list |> hd
end
end
end
问题出在第3行:在匿名函数中,我必须返回元组{f, n / f}
,其中f
是的最低因子,n
是在lf
函数中计算的。但是,我不想两次计算(我可以这样做{lf n, div(n, lf n)}
)。我也试图定义一个闭包,但是显然不允许这样做。
我使用的技巧甚至都行不通。
怎么做?
您是否尝试在匿名函数中分配局部变量?我添加了换行符以使其更具可读性。
def factors(n) when is_integer(n) and n > 1 do
Stream.unfold(n,
fn 1 -> nil
n -> local = lf n
{local, div(n, local)}
end) |> Enum.to_list
end
顺便说一句,您可以lf
使用来缩短功能Enum.find
。(我也将lf
执行私有功能。)
defp lf(n) when is_integer(n) and n > 1 do
if rem(n, 2) == 0 do 2
else Stream.iterate(3, &(&1 + 2)) |> Enum.find(&(rem(n, &1) == 0))
end
end
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句