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

O que aprendi ao implementar um algoritmo que resolve Sudoku em Python

O que aprendi ao implementar um algoritmo que resolve Sudoku em Python

Lição aprendida que levarei para minha vida profissional. Nessa talk falo sobre programação recursiva, backtracking e tail recursion elimination em Python. Talk apresentada no PUG-PI (Python Users Group - Piaui)

Will Soares

February 24, 2018
Tweet

More Decks by Will Soares

Other Decks in Programming

Transcript

  1. Quem sou? Desenvolvedor Front-end @ Codeminer42 Bacharel em Ciência da

    Computação Escrevo posts aleatórios no dev.to e no meu blog Iniciante na arte de ensinar (skillshare.com)
  2. Agenda > Como surgiu esta talk? > Descrição do problema

    a ser resolvido > Programação recursiva > Backtracking > Show me the code > O que aprendi? > Links úteis e referências
  3. Disclaimer > Código não otimizado > Existem diversas formas de

    resolver o mesmo problema > O foco maior é no aprendizado final
  4. Cenário Entrada Requisitos de processamento Saída Matriz parcialmente preenchida [1,

    2, 3, 0, 0, …, 0, 0, 9] Recursividade e Backtracking Matriz corretamente preenchida OU Inexistência da solução [1, 2, 3, 6, …, 4, 5, 9] OU “Sem solução!”
  5. Passos básicos 1. Inicialização 2. Verificação do caso básico 3.

    Definição de um problema menor 4. Combinar resultados 5. Apresentar solução
  6. Linguagem Nº máximo de chamadas recursivas * Python ~ 1.000

    Ruby ~ 10.900 JavaScript ~ 11.448 Java ~ 11.116 rosettacode.org/wiki/Find_limit_of_recursion * Valores variam dependendo do sistema em que as verificações foram realizadas.
  7. Tail Recursion Elimination Diminuir uso de memória ao reutilizar o

    espaço de memória alocado para o frame atual na pilha de chamadas recursivas.
  8. Alternativas Implementar Tail Recursion Elimination em Python com o uso

    de decorators. https://tomforb.es/adding-tail-call-optimization-to-python
  9. O que aprendi? > Entenda seu problema antes de pensar

    em soluções > Não existe uma linguagem que serve para tudo > É importante conhecer as limitações de uma tecnologia antes de utilizá-la > Em contextos didáticos, é interessante fugir do convencional