Upgrade to Pro — share decks privately, control downloads, hide ads and more …

JSExperience 7masters - Recursion & Trampolines

JSExperience 7masters - Recursion & Trampolines

Ana Luiza Portello

July 05, 2018
Tweet

More Decks by Ana Luiza Portello

Other Decks in Programming

Transcript

  1. const iterativeFactorial = (n) => { let i let contador

    = 0 for (i = 1; i <= n; i++) { contador *= i } return contador }
  2. const fac = (n) => { if (n == 0)

    { return 1 } return n * fac(n - 1) }
  3. • EXPRESSIVO • PURO / EVITANDO MUDANÇA DE ESTADO(CONTADOR) •

    IMUTABILIDADE DE DADOS • DECLARATIVO • IDEMPOTENCIA
  4. GC fac(3) GC fac(2) fac(3) GC fac(1) fac(2) fac(3) GC

    fac(0) fac(1) fac(2) fac(3) GC call call call call
  5. GC fac(3) GC fac(2) fac(3) GC fac(1) fac(2) fac(3) GC

    fac(0) fac(1) fac(2) fac(3) GC 1 1* 1 = 1 1 * 2 = 2 2 * 3 = 6
  6. GC fac(9999) GC fac(9998) fac(9999) GC fac(9997) fac(9998) fac(9999) GC

    oh no ... fac(9998) fac(9999) GC StackOverFlow :(
  7. GC fac(3) GC fac(2) fac(3) GC fac(1) fac(2) fac(3) GC

    fac(0) fac(1) fac(2) fac(3) GC call call call call
  8. TCO faz com que a gente evite explodir o stack

    quando fazemos chamadas recursivas
  9. //Não é tail call :( const fac = (n) =>

    n == 0 ? 1 : n * fac(n - 1)
  10. A última coisa a ser feita na função é o

    retorno da própria função.
  11. const tailRecursiveFac = (n, acc = 1) => { return

    n == 0 ? acc : tailRecursiveFac(n - 1, acc * n) }
  12. Além disso existem casos de algoritmos que precisam de mais

    de duas chamadas recursivas(multiple recursion) e não tem como colocar tudo no final
  13. Um estilo de programação em que o controle é passado

    explicitamente em forma de continuação
  14. Continuação é uma parte de código que ainda vai ser

    executada em algum ponto do programa Callbacks por exemplo são continuations
  15. Continuação não chama a si mesma, ela só expressa um

    fluxo de computação onde os resultados fluem em uma direção. Aplicar continuações não é chamar funções é passar o controle do resultado.
  16. > (1 + 3) * 2 8 > const expression

    = () => (1 + 3) * 2 > expression() 8
  17. CPS elimina a necessidade de um call stack pois os

    valores estarão dentro da continuation sendo executada .
  18. • O último parâmetro da função é sempre a continuation.

    • Todas as funções precisam acabar chamando sua continuação com o resultado da execução da função.
  19. const cpsFac = (n, con) => { return n ==

    0 ? con(1) : cpsFac(n - 1, y => con(n + y)) } cpsFac(3, id) //6
  20. Um trampoline é um loop que iterativamente invoca funções que

    retornam thunks (continuation-passing style)
  21. Função que encapsula outra função com os parâmetros que para

    quando a execução dessa função for necessária.
  22. Ao invés de chamar a tail call diretamente, cada método

    retorna a chamada para um thunk para o trampolim chamar.
  23. • É um loop que chama funções repetidamente • Cada

    função é chamada de thunk. • O trampolim nunca chama mais de um thunk • É como se quebrasse o programa em pequenos thunks que saltam pra fora do trampolim, assim o stack não cresce.
  24. const trampolineFac = (n) { const fac = (n, ac

    = 1) => { return n == 0 ? ac : thunk(fac, n - 1, ac * n) } return trampoline(thunk(fac, n, 1)) }
  25. :(

  26. Trade off por stack safety Trocamos o trabalho de criar

    stack frames com o de criar binding de funções.
  27. Trampolines são mais apropriadas para funções complexas em que não

    existem soluções iterativas e não conflitam com outras técnicas de mediar controle de fluxo(Promises).
  28. • Kyle Simpson. Functional Light Programming. Cap 8. - github.com/getify/Functional-Light-JS

    • Functional Programming Jargon - github.com/hemanth/functional-programming-jarg on • Structure and Interpretation of Computer Programs - Javascript Adaptation