Last active
April 16, 2024 20:20
-
-
Save coproduto/936b2a2ef2c974957b4f2cf43c1aa3bd to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- Imagina que a gente não tivesse recursão. Isso significaria essencialmente que uma expressão não pode se referir ao nome | |
-- dela mesma dentro da definição dela. Por exemplo, a definição de fatorial abaixo não poderia existir: | |
factorialRec n = n * factorialRec (n - 1) | |
-- Como o nome factorialRec é citado na função e estamos proibindo citar o nome da própria função, esse termo se torna | |
-- ilegal. Então como poderíamos escrever a função fatorial? Bom, uma ideia é trocar a chamada recursiva por um argumento: | |
factorialOpen f n = n * f (n - 1) | |
-- agora a gente tem um fatorial "aberto" - se a gente conseguir passar o fatorial "fechado" pra ele, o resultado dele | |
-- vai ser o fatorial "fechado". Ou seja, o *ponto fixo* da função factorialOpen é a função factorialRec | |
-- (um ponto fixo é um argumento de uma função tal que a função retorna o valor do argumento). Como a gente pode | |
-- se referir ao fatorial "fechado"? Bom, a gente precisaria de uma função que: | |
-- 1. Recebe uma função de 1 argumento | |
-- 2. Passa o ponto fixo dessa função para ela | |
-- 3. Retorna o valor resultante | |
-- Ou seja: | |
fix f = f (fix f) | |
-- E agora podemos definir: | |
factorialY = fix factorialOpen | |
-- E o comportamento de factorialY é igual ao de factorialRec. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment