在 Elixir 中映射时使用列表

问题描述 投票:0回答:0

我是 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 中的方法解决这些问题?

elixir
© www.soinside.com 2019 - 2024. All rights reserved.