Elixir - Recursão

Recursão é um método em que a solução de um problema depende das soluções para instâncias menores do mesmo problema. A maioria das linguagens de programação de computador oferece suporte à recursão, permitindo que uma função chame a si mesma dentro do texto do programa.

Idealmente, as funções recursivas têm uma condição final. Essa condição final, também conhecida como caso base, para de reinserir a função e adicionar chamadas de função à pilha. É aqui que a chamada de função recursiva para. Vamos considerar o exemplo a seguir para entender melhor a função recursiva.

defmodule Math do
   def fact(res, num) do
   if num === 1 do
      res
   else
      new_res = res * num
      fact(new_res, num-1)
      end
   end
end

IO.puts(Math.fact(1,5))

Quando o programa acima é executado, ele gera o seguinte resultado -

120

Então, na função acima, Math.fact, estamos calculando o fatorial de um número. Observe que estamos chamando a função dentro dela mesma. Vamos agora entender como isso funciona.

Fornecemos 1 e o número cujo fatorial queremos calcular. A função verifica se o número é 1 ou não e retorna res se for 1(Ending condition). Caso contrário, ele cria uma variável new_res e atribui a ela o valor de res anterior * num atual. Ele retorna o valor retornado por nosso fato de chamada de função (new_res, num-1) . Isso se repete até obtermos num como 1. Quando isso acontece, obtemos o resultado.

Vamos considerar outro exemplo, imprimindo cada elemento da lista um por um. Para fazer isso, vamos utilizar ohd e tl funções de listas e correspondência de padrões em funções -

a = ["Hey", 100, 452, :true, "People"]
defmodule ListPrint do
   def print([]) do
   end
   def print([head | tail]) do 
      IO.puts(head)
      print(tail)
   end
end

ListPrint.print(a)

A primeira função de impressão é chamada quando temos uma lista vazia(ending condition). Caso contrário, a segunda função de impressão será chamada, dividindo a lista em 2 e atribuindo o primeiro elemento da lista ao cabeçalho e o restante da lista ao final. A cabeça é então impressa e chamamos a função de impressão novamente com o resto da lista, ou seja, cauda. Quando o programa acima é executado, ele produz o seguinte resultado -

Hey
100
452
true
People