defmodule Math do
# We start of by passing the sum/1 function a list of numbers.
def sum(numbers) do
# Recurse over the list when it contains at least one element.
# We break the list up into two parts:
# head: the first element of the list
# tail: a list of all elements except the head
# Every time this function is executed it makes the list of numbers
# one element smaller until it is empty.
defp do_sum([head|tail], acc) do
do_sum(tail, head + acc)
# When we have reached the end of the list, return the accumulated sum
defp do_sum(, acc), do: acc