Entendendo recursão

Estruturas de Dados e Algoritmos em Python

Miriam Antona

Software engineer

Definição

  • Função chamando a si mesma
  • Quase todos os casos em que usamos loops
    • dá para substituir por recursão
  • Resolve problemas que parecem bem complexos no início
Estruturas de Dados e Algoritmos em Python

Exemplo - fatorial

$n!$

Estruturas de Dados e Algoritmos em Python

Exemplo - fatorial

$n!=n$ · $(n-1)$ · $(n-2)$ · $...$ · $1$

$5!=$ $5$ · $4$ · $3$ · $2$ · $1=120$

def factorial(n):
  result = 1
  while n > 1:
    result = n * result
    n -= 1
  return result
factorial(5)
120
Estruturas de Dados e Algoritmos em Python

Exemplo - fatorial com recursão

$n!= n$ · $(n-1)!$

def factorial_recursion(n):
  return n * factorial_recursion(n-1)
  • Executa para sempre!
Estruturas de Dados e Algoritmos em Python

Exemplo - identificando o caso base

  • Adicione uma condição
    • garante que o algoritmo não rode para sempre
  • Caso base do fatorial -> $n=1$
def factorial_recursion(n):
  if n == 1:

return 1
else:
return n * factorial_recursion(n-1)
print(factorial_recursion(5))
120
Estruturas de Dados e Algoritmos em Python

Como a recursão funciona

  • O computador usa uma pilha para rastrear as funções
    • Call stack
Estruturas de Dados e Algoritmos em Python

Como a recursão funciona

  • factorial(5) inicia
  • Antes de factorial(5) terminar -> factorial(4) inicia
  • Antes de factorial(4) terminar -> factorial(3) inicia

Imagem de uma fila com um elemento que representa uma função.

Estruturas de Dados e Algoritmos em Python

Como a recursão funciona

  • factorial(5) inicia
  • Antes de factorial(5) terminar -> factorial(4) inicia
  • Antes de factorial(4) terminar -> factorial(3) inicia
  • Antes de factorial(3) terminar -> factorial(2) inicia

Imagem de uma fila com dois elementos que representam duas funções.

Estruturas de Dados e Algoritmos em Python

Como a recursão funciona

  • factorial(5) inicia
  • Antes de factorial(5) terminar -> factorial(4) inicia
  • Antes de factorial(4) terminar -> factorial(3) inicia
  • Antes de factorial(3) terminar -> factorial(2) inicia
  • Antes de factorial(2) terminar -> factorial(1) inicia

Imagem de uma fila com três elementos que representam três funções.

Estruturas de Dados e Algoritmos em Python

Como a recursão funciona

  • factorial(5) inicia
  • Antes de factorial(5) terminar -> factorial(4) inicia
  • Antes de factorial(4) terminar -> factorial(3) inicia
  • Antes de factorial(3) terminar -> factorial(2) inicia
  • Antes de factorial(2) terminar -> factorial(1) inicia

Imagem de uma fila com quatro elementos que representam quatro funções.

Estruturas de Dados e Algoritmos em Python

Como a recursão funciona

  • factorial(1) termina
    • retorna 1
  • factorial(2) termina

Imagem de uma fila com quatro elementos que representam quatro funções.

Estruturas de Dados e Algoritmos em Python

Como a recursão funciona

  • factorial(1) termina
    • retorna 1
  • factorial(2) termina
    • retorna 2

Imagem de uma fila com quatro elementos que representam quatro funções. A última função é acompanhada pelo seu valor de retorno.

Estruturas de Dados e Algoritmos em Python

Como a recursão funciona

  • factorial(1) termina
    • retorna 1
  • factorial(2) termina
    • retorna 2
  • factorial(3) termina
    • retorna 6

Imagem de uma fila com três elementos que representam três funções.

Estruturas de Dados e Algoritmos em Python

Como a recursão funciona

  • factorial(1) termina
    • retorna 1
  • factorial(2) termina
    • retorna 2
  • factorial(3) termina
    • retorna 6
  • factorial(4) termina
    • retorna 24

Imagem de uma fila com dois elementos que representam duas funções.

Estruturas de Dados e Algoritmos em Python

Como a recursão funciona

  • factorial(1) termina
    • retorna 1
  • factorial(2) termina
    • retorna 2
  • factorial(3) termina
    • retorna 6
  • factorial(4) termina
    • retorna 24
  • factorial(5) termina
    • retorna 120

Imagem de uma fila com um elemento que representa uma função.

Estruturas de Dados e Algoritmos em Python

Como a recursão funciona

  • factorial(1) termina
    • retorna 1
  • factorial(2) termina
    • retorna 2
  • factorial(3) termina
    • retorna 6
  • factorial(4) termina
    • retorna 24
  • factorial(5) termina
    • retorna 120

Imagem de uma fila vazia.

Estruturas de Dados e Algoritmos em Python

Programação dinâmica

  • Técnica de otimização
  • Principalmente aplicada à recursão
  • Pode reduzir a complexidade de algoritmos recursivos
  • Usada para:
    • Problemas que podem ser divididos em subproblemas menores
    • Subproblemas se sobrepõem
  • Soluções dos subproblemas são salvas para evitar recálculo
    • Memoization
Estruturas de Dados e Algoritmos em Python

Vamos praticar!

Estruturas de Dados e Algoritmos em Python

Preparing Video For Download...