Here’s a quick post about how to write a combinations
function in elixir
using pattern-matching and recursion:
defmodule Combinations do
@doc """
This function lists all combinations of `num` elements from the given `list`
"""
def combinations(list, num)
def combinations(_list, 0), do: [[]]
def combinations(list = [], _num), do: list
def combinations([head | tail], num) do
Enum.map(combinations(tail, num - 1), &[head | &1]) ++
combinations(tail, num)
end
end
## Examples
iex> Combinations.combinations([:a, :b, :c, :d, :e], 2)
[
[:a, :b],
[:a, :c],
[:a, :d],
[:a, :e],
[:b, :c],
[:b, :d],
[:b, :e],
[:c, :d],
[:c, :e],
[:d, :e]
]
iex> Combinations.combinations([1, 2, 3], 2)
[[1, 2], [1, 3], [2, 3]]