Elixir内置组合方法?

时间:2019-04-28 20:33:12

标签: elixir combinations

defmodule Itertools
    def combinations(_, 0), do: [[]] 
    def combinations([], _), do: [] 
    def combinations([h|t], m) do 
        (for l <- combinations(t, m-1), do: [h|l]) ++ combinations(t, m) 
    end 
end 

我正在处理数组上的嵌套循环,该循环可以由Python的itertools.combinations之类的东西处理,但在标准库中看不到。 elixir是否内置在某个地方,还是有更好的方法在Elixir中的列表上模拟三角环?

我从rosettacode.org btw获得了上面的代码。

2 个答案:

答案 0 :(得分:0)

与Erlang类似,Elixir没有内置功能来进行组合。正如Rosettacode所说的“此Elixir代码刚刚从Erlang转换而来”:

defmodule RC do
  def comb(0, _), do: [[]]
  def comb(_, []), do: []
  def comb(m, [h|t]) do
    (for l <- comb(m-1, t), do: [h|l]) ++ comb(m, t)
  end
end

{m, n} = {3, 5}
list = for i <- 1..n, do: i
Enum.each(RC.comb(m, list), fn x -> IO.inspect x end)

https://rosettacode.org/wiki/Combinations#Elixir

答案 1 :(得分:0)

我不知道有任何内置方法可以执行此操作,但是GitHub上的Comb包可以做到这一点。

您当然需要将其添加到您的mix.exs依赖项中:

[
  {:comb, git: "https://github.com/tallakt/comb.git", tag: "master"}
]

然后您可以像这样使用它(取自上面链接的GitHub文档):

iex> combinations(1..3, 2) |> Enum.to_list
[[1, 2], [1, 3], [2, 3]]

iex> combinations([1, 1, 2, 2], 3) |> Enum.to_list
[[1, 1, 2], [1, 2, 2]]

它还支持笛卡尔积:

iex> cartesian_product(1..2, 3..4)
[[1, 3], [1, 4], [2, 3], [2, 4]]