Elixir: Combinations

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]]