Você está na página 1de 34

Recursividade

ÉFREN L. SOUZA

EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 1


Recursividade
EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 2
Recursão
É um processo que define um problema (ou a
solução de um problema) em termos de uma
versão mais simples de si mesmo

EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 3


Definição Recursiva de
Ancestralidade

I. Meu pai é meu ancestral


II. Os ancestrais do meu pai também
são meus ancestrais

EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 4


Espelho
▪Segure um espelho em
frente a outro espelho
▪O espelho irá refletir a si
próprio infinitamente

EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 5


Videoconferência
▪Quando você compartilha a tela
da videoconferência na
videoconferência

EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 6


Objetos
Recursivos
▪São objetos criados a partir de
objetos de mesmo tipo já
existentes
▪A partir de um objeto
previamente definido é possível
criar um conjunto de objetos do
mesmo tipo através de um
processo recursivo

EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 7


Tetra-Círculo
▪É um objeto criado
recursivamente
▪Dado o centro e raio de um
círculo inicial
▪Cada círculo é formado de 4
outros círculos com metade
da sua circunferência e
centralizados em seus polos
▪Quantas divisões podem ser
feitas? Quando parar?

EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 8


Resolvendo Problemas Recursivamente
EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 9
Recursão & Problemas
▪A recursão pode ser usada para resolver problemas
através das versões menores do mesmo problema
(subproblemas)
▪Os subproblemas são reduzidos em subproblemas ainda
menores até atingir uma versão trivial
▪A técnica usada para resolver os subproblemas e o
problema original é a mesma
▪Resolver um subproblema significa resolver parte do
problema original
EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 10
Responda rápido! Qual o valor da multiplicação
Problema de abaixo?
Multiplicação 3 × 14.760 = ?
▪ Sabemos que a Difícil sem usar calculadora ou caneta e papel.
multiplicação é uma
sequência de somas, i.e., Mas agora se eu disser que
5×3=5+5+5
3 × 14.759 = 44.277
▪ Resolver multiplicações qual seria o valor da primeira multiplicação?
menores ajuda a resolver
as maiores
Ficou muito mais fácil porque todos os
subproblemas anteriores (somas) já foram
resolvidos, faltando apenas o último.
EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 11
Subproblemas de
Multiplicação 5 × 5 = (5 + 5 + 5 + 5) + 5 = 5 × 4 + 5

5×4= 5×3 +5
▪ Pegamos um problema
complexo e o reduzimos
gradativamente até atingir 5×3= 5×2 +5
uma versão trivial
▪ A versão trivial é chamada 5×2= 5×1 +5
de caso base e ela tem um
resultado pronto
▪ O resultado dos 5×1= 5×0 +5
subproblemas menores
são usados para resolver 5×0=0
os maiores

EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 12


Recursão &
def rec_func():
...
Programação
... chamada
recursiva ▪No contexto da programação,
rec_func() a recursão se dá através de
... funções recursivas
...

chamada
principal
rec_func()

EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 13


Funções Recursivas
Uma função é dita recursiva quando essa possui
uma chamada para si mesma

EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 14


Composição de
Funções Recursivas
def countdown(n): ▪Uma função recursiva é
if n==0: dividida em duas partes:
Caso
base

print(n) ▪Casos recursivos


else: ▪Casos base
recursivo

print(n)
Caso

countdown(n-1)

EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 15


5 × 99 = 5 × 98 + 5
Caso recursivo
5 × 98 = 5 × 97 + 5 ▪Ocorre quando o subproblema ainda não
é trivial e precisa ser reduzido
5 × 97 = 5 × 96 + 5 ▪Para isso, é feita uma chamada recursiva
para resolver uma versão mais simples do
problema
5 × 96 = 5 × 95 + 5
▪O problema continua sendo simplificado
⋮ até chegar ao caso base

EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 16


⋮ Caso base
5×3= 5×2 +5 ▪É onde a recursão termina
▪O caso recursivo reduz o problema até
5×2= 5×1 +5 chegar ao caso base
▪O subproblema se torna simples o
5×1= 5×0 +5 suficiente para ser resolvido diretamente

5×0=0

EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 17


def mult(m, n):
if n == 0:
Multiplicação return 0
recursiva else:
return m + mult(m, n-1)

▪ A função recursiva ao lado print(mult(5, 4))


soma 𝑚 𝑛 vezes, i.e., retorna o
valor de 𝑚 × 𝑛 20 mult(5, 4)
15
▪ As soluções dos subproblemas mult(5, 3)
menores são usadas para 10
resolver os maiores mult(5, 2)
5
▪ Cada chamada recursiva é
empilhada mult(5, 1)
0
mult(5, 0)

EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 18


Fatorial
EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 19
Fatorial
▪O fatorial de um número natural 𝑛 é o
produto de seus antecessores, incluindo a si
próprio e excluindo o zero
▪O fatorial de 𝑛 é representado por 𝑛!

5! = 5 × 4 × 3 × 2 × 1

EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 20


Fatorial para
resolver fatorial
▪O fatorial de 5 é
5! = 5 × 4 × 3 × 2 × 1

▪Mas também pode ser visto como


5! = 5 × 4!

EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 21


Fatorial – Definição Recursiva

1 𝑠𝑒 𝑛 ≤ 1
𝑓𝑎𝑡 𝑛 = ቊ
𝑛 × 𝑓𝑎𝑡(𝑛 − 1) 𝑐𝑎𝑠𝑜 𝑐𝑜𝑛𝑡𝑟á𝑟𝑖𝑜

EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 22


Fatorial: 1 𝑠𝑒 𝑛 ≤ 1
Algoritmo Recursivo 𝑓𝑎𝑡 𝑛 = ቊ
𝑛 × 𝑓𝑎𝑡(𝑛 − 1) 𝑐𝑎𝑠𝑜 𝑐𝑜𝑛𝑡𝑟á𝑟𝑖𝑜

def fat(n):
if n <= 1:
return 1
else:
return n * fat(n-1)

EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 23


Fatorial:
Árvore de Recursão

▪ Cada chamada da função que entra


no caso recursivo faz uma nova
chamada da mesma função
▪ A execução de uma função recursiva
só finaliza depois que todas as
chamadas recursivas feitas a partir
dela são finalizadas
▪ A recursão finaliza quando chega ao
caso base

EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 24


Fibonacci
EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 25
Fibonacci
▪A Série de Fibonacci é muito comum
na natureza e, em particular,
descreve a forma de uma espiral
▪Essa série inicia com 0 e 1 e tem a
propriedade de que cada número
subsequente é a soma dos dois
números anteriores

0, 1, 1, 2, 3, 5, 8, 13, 21 …
EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 26
Fibonacci para
resolver Fibonacci
0 1 2 3 4 5 6 7 8
0, 1, 1, 2, 3, 5, 8, 13, 21 …
+

𝑓𝑖𝑏(8) = 8 + 13 = 21
𝑓𝑖𝑏(8) = 𝑓𝑖𝑏(6) + 𝑓𝑖𝑏(7)

EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 27


Fibonacci – Definição Recursiva

0 𝑠𝑒 𝑛 = 0
𝑓𝑖𝑏 𝑛 = ቐ 1 𝑠𝑒 𝑛 = 1
𝑓𝑖𝑏 𝑛 − 1 + 𝑓𝑖𝑏(𝑛 − 2) 𝑐𝑎𝑠𝑜 𝑐𝑜𝑛𝑡𝑟á𝑟𝑖𝑜

EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 28


0 𝑠𝑒 𝑛 = 0
𝑓𝑖𝑏 𝑛 = ቐ 1 𝑠𝑒 𝑛 = 1
Fibonacci: 𝑓𝑖𝑏 𝑛 − 1 + 𝑓𝑖𝑏(𝑛 − 2) 𝑐𝑎𝑠𝑜 𝑐𝑜𝑛𝑡𝑟á𝑟𝑖𝑜
Algoritmo Recursivo

def fib(n):
▪ Retorna o 𝑛-ésimo número da if n == 0:
sequência de Fibonacci
return 0
elif n == 1:
return 1
else:
return fib(n-2) + fib(n-1)

EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 29


Fibonacci:
Árvore de Recursão

EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 30


Quando usar recursão
EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 31
Vantagens &
Desvantagens
Vantagens Desvantagens
+ Maior clareza do algoritmo para - Geralmente tem desempenho
problemas com definição inferior devido ao gerenciamento
naturalmente recursiva de chamadas (call stack)

+ Redução do tamanho do código - Dificuldade de depuração

EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 32


Quando a Recursividade
Vale a Pena
▪Recursividade vale a pena para algoritmos
cuja implementação iterativa requer o uso
explícito de uma pilha
▪ Dividir e Conquistar (e.g. Quicksort, Merge-sort)
▪ Caminhamento em grafos e árvores (pesquisa,
backtracking)

EFREN L. SOUZA / PROGRAMAÇÃO / UFOPA – IEG – PC 33


Bibliografia
[1] Banin, S.Luiz.; Python 3: Conceitos e Aplicações –
Uma Abordagem Didática. Érica, 1ª edição, 2018.
[2] Manzano, J.A.N.G.; Oliveira, J.F. Algoritmos:
Lógica para Desenvolvimento de Programação de
Computadores. Érica, 29ª edição, 2019.
[3] Souza, M.A.F; Gomes, M.M.; Soares, M.V.
Algoritmos e Lógica de Programação. Cengage, 3ª
edição, 2019.
[4] https://docs.python.org/3/

EFREN L. SOUZA / PROGRAMAÇÃO/ UFOPA – IEG – PC 34

Você também pode gostar