Maratona de Haskell - Décimo Terceiro Dia

Fala pessoal!

Ontem nós reescrevemos algumas funções standar do Haskell e como eu comentei essas funções estavam usando recursão. Provavelmente a maioria ou a totalidade de vocês sabe o que é recursão. Mas se por acaso alguém não sabe eu vou explicar em poucas palavras.

Recursão é ou acontece quando uma função chama a si mesma com diferentes parâmetros até encontrar o caso base. E o que é o caso base? Caso base é quando a função retorna o resultado e não continua a se chamar, em outras palavras quando a função não tem mais trabalho a fazer.

Um bom exemplo de recursão é fibonacci. Como isso funciona? Bem, vamos começar pensando na assinatura de fibonacci que é uma função que recebe um número e retorna uma lista. Então fibonacci recebe um número e decompõem em uma lista até que a o número alcance o número 1. Em cada passo o número é decrescido de 1. Se o número é 1 ou 0 ele recebe o mesmo valor em uma lista. Ops, 1 ou 0? Parece que já temos nosso caso base.
Vamos ver um exemplo:

Se fibonacci recebe o número 4 como seria?
4 : 3 : 2 : 1 = [4,3,2,1]
Vamos olhar por outro prisma:
4 + (4 - 1) + ((4 - 1) - 1) + ((4 - 1) - 1) - 1) = [4,3,2,1]
Você consegue ver a recursão neste exemplo? Nem eu.
Vamos ver como funciona no Haskell:

fibonacci :: Int -> [Int]
fibonacci 0 = [0]
fibonacci 1 = [1]
fibonacci x = x : fibonacci (x - 1)


fibonacci 4
[4,3,2,1]

Agora você pode ver a recursão e a função fibonacci chamando ela mesma.


Em programação funcional a técnica de recursão é realmente importante, diferentemente da programação imperativa nós não temos passos para seguir e por causa disso a função tem que chamar a si própria para retornar algum dado valioso ou fazer algo interessante.

Written on December 13, 2016