We can't find the internet

Attempting to reconnect

Something went wrong!

Hang in there while we get back on track

#
2023 / 09 / 24
Permutations in Elixir

2023 / 09 / 24

Generate all the permutations of a given list

elixir

While working on a problem, suddenly I had the need to get a hold of all the permutations of the elements in a list.

Thus, I did what any good engineer would do: I browsed the internet for a little bit and found a solution.

It makes use of for comprehensions and recursion.

It’s very concise and elegant, judge yourself:

```
defmodule Util do
def permutations([]), do: [[]]
def permutations(list) do
for(item <- list, rest <- permutations(list -- [item]), do: [item | rest])
end
end
```

For an input like this:

`Util.permutations([1, 2, 3])`

It’ll return this:

```
[
[1, 2, 3],
[1, 3, 2],
[2, 1, 3],
[2, 3, 1],
[3, 1, 2],
[3, 2, 1]
]
```

# With repetition

Here is the implementation for generating permutations with repetition:

```
defmodule Util do
def permutations_with_repetition(list) do
permutations_with_repetition(list, length(list))
end
defp permutations_with_repetition(_list, 0), do: [[]]
defp permutations_with_repetition(list, l) do
for(item <- list, rest <- permutations_with_repetition(list, l - 1), do: [item | rest])
end
end
```

For this input:

`Util.permutations_with_repetition([1, 2, 3])`

It’ll generate:

```
[
[1, 1, 1], [1, 1, 2], [1, 1, 3],
[1, 2, 1], [1, 2, 2], [1, 2, 3],
[1, 3, 1], [1, 3, 2], [1, 3, 3],
[2, 1, 1], [2, 1, 2], [2, 1, 3],
[2, 2, 1], [2, 2, 2], [2, 2, 3],
[2, 3, 1], [2, 3, 2], [2, 3, 3],
[3, 1, 1], [3, 1, 2], [3, 1, 3],
[3, 2, 1], [3, 2, 2], [3, 2, 3],
[3, 3, 1], [3, 3, 2], [3, 3, 3]
]
```