我想找到一个数字的素因子。我写道:
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
的最低因子,并在{{1}中计算功能。但是,我不想计算两次(我可以做lf
)。我也试图定义一个闭包,但显然它是不允许的。
我使用的技巧甚至不起作用。
怎么做?
答案 0 :(得分:3)
您是否尝试在匿名函数中分配局部变量?我添加了换行符以使其更具可读性。
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
顺便说一句,您可以使用Enum.find
缩短lf
功能。 (我还将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