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