我是 Elixir 编程的新手,所以我尝试解决 Project Euler 中的一些问题,但遇到了第七个问题。
我解决了这个任务,但是下面的代码太慢了.
Stream.iterate(2, &(&1 + 1))
|> Stream.filter(fn x -> Stream.find(2..x, fn y -> rem(x, y) == 0 end) == nil end)
|> Enum.take(10_001)
我想边处理边读取当前列表,因为它快了10倍!
在像 Rust 这样的命令式编程语言中,我可以这样做:
let mut list = vec![2];
let mut i = 2;
let mut is_prime: bool;
while list.len() != n {
i += 1;
is_prime = true;
for j in &list {
if i % j == 0 {
is_prime = false;
break;
}
}
if is_prime {
list.push(i);
}
}
当我试图解决第十个问题时,我写了这段代码:
list = []
for i <- 2..(2_000_000 - 1) do
if Enum.find(list, fn x -> rem(x, i) == 0 end) == nil do
list = list ++ [i]
end
end
Enum.sum(list) |> IO.puts()
但我收到这条消息:
warning: variable "list" is unused (there is a variable with the same name in the context, use the pin operator (^) to match on it or prefix this variable with underscore if it is not meant to be used)
我希望列表会更新,但我什至无法访问它。
如何用我在 Elixir 中的方法解决这些问题?