Documente Academic
Documente Profesional
Documente Cultură
Aula 3: Recursão
Universidade Federal do Triângulo Mineiro
1 Recursão
O que é recursão?
Dividir para conquistar
Algoritmos recursivos vs Algoritmos iterativos
2 Exemplos
Exemplo: sequência de Fibonacci
Exemplo: Backtracking
Próximo Tópico
1 Recursão
O que é recursão?
Dividir para conquistar
Algoritmos recursivos vs Algoritmos iterativos
2 Exemplos
Exemplo: sequência de Fibonacci
Exemplo: Backtracking
1 , se n = 0
2n =
2 · 2n−1 , se n ≥ 1
1 , se n = 0
2n =
2 · 2n−1 , se n ≥ 1
1 Recursão
O que é recursão?
Dividir para conquistar
Algoritmos recursivos vs Algoritmos iterativos
2 Exemplos
Exemplo: sequência de Fibonacci
Exemplo: Backtracking
Motivação
O grande potencial da recursão está na possibilidade de poder definir
elementos com base em versões mais simples desses mesmos
elementos.
Motivação
O grande potencial da recursão está na possibilidade de poder definir
elementos com base em versões mais simples desses mesmos
elementos.
Ou seja
Em termos computacionais, trata-se de dividir um problema maior em
problemas menores, em que a resolução é feita por uma mesma função,
que é recorrentemente chamada.
Motivação
O grande potencial da recursão está na possibilidade de poder definir
elementos com base em versões mais simples desses mesmos
elementos.
Ou seja
Em termos computacionais, trata-se de dividir um problema maior em
problemas menores, em que a resolução é feita por uma mesma função,
que é recorrentemente chamada.
1 , se n = 0
n! =
n · (n − 1)!, se n ≥ 1
1 , se n = 0
n! =
n · (n − 1)!, se n ≥ 1
4! = 4 * 3! Ida
3! = 3 * 2!
2! = 2 * 1!
1! = 1 * 0!
0! = 1
1! = 1 * 1
2! = 2 * 1
3! = 3 * 2!
4! = 4 * 6 = 24 Volta
fatorial(0)
fatorial(1) fatorial(0)
MEMÓRIA
CHAMADA DA FUNÇÃO
return 1 return
1*fatorial(0) return
1*1 2*fatorial(1)
MEMÓRIA
fatorial(1) return
2*1*1
3*fatorial(2)
fatorial(2) fatorial(2) return
3*2*1*1
4*fatorial(3)
fatorial(3) fatorial(3) fatorial(3) 4*3*2*1*1
fatorial(4) fatorial(4) fatorial(4) fatorial(4)
main() main() main() main() main()
RETORNO DA FUNÇÃO
Figura : Ilustração do uso da memória no caminho de volta da recursão.
Professor Me. Rooney R. A. Coelho (UFTM) Aula 3 30 de Agosto de 2017 19 / 40
Recursão
Em funções recursivas duas coisas devem ficar bem estabelecidas: o
critério de parada e o parâmetro da chamada recursiva.
Cuidado
Se o valor do parâmetro for sempre o mesmo, a função continuará
executando até esgotar a memória do computador.
1 Recursão
O que é recursão?
Dividir para conquistar
Algoritmos recursivos vs Algoritmos iterativos
2 Exemplos
Exemplo: sequência de Fibonacci
Exemplo: Backtracking
Ponto negativo
Em muitos casos, as versões recursivas consomem maior número de
recursos (principalmente memória e processamento) e são muito
mais difíceis de testar quando há muitas chamadas.
Ponto negativo
Em muitos casos, as versões recursivas consomem maior número de
recursos (principalmente memória e processamento) e são muito
mais difíceis de testar quando há muitas chamadas.
Ponto positivo
A obtenção de códigos mais “enxutos” e mais fáceis de
compreender, mais fáceis de implementar em linguagens de
programação.
Iteração Recursão
estrutura de repetição estrutura de seleção
repetição explícita chamadas repetidas de funções
condição se tornar falsa caso básico é reconhecido
loop infinito não chegar no caso básico
Iteração Recursão
estrutura de repetição estrutura de seleção
repetição explícita chamadas repetidas de funções
condição se tornar falsa caso básico é reconhecido
loop infinito não chegar no caso básico
Cuidado!
A recursão ativa repetidamente o mecanismo de chamadas de funções,
o que pode custar caro tanto em termos de tempo de processamento
como em alocação de memória.
1 Recursão
O que é recursão?
Dividir para conquistar
Algoritmos recursivos vs Algoritmos iterativos
2 Exemplos
Exemplo: sequência de Fibonacci
Exemplo: Backtracking
Definição
Cada termo subsequente
corresponde à soma dos dois
termos precedentes.
Cuidado!
a solução recursiva para a sequência de Fibonacci é muito elegante.
Infelizmente, ela contém duas chamadas para si mesma. Isso
significa que ela contém duas chamadas recursivas. Logo, sua
elegância não significa eficiência.
Professor Me. Rooney R. A. Coelho (UFTM) Aula 3 30 de Agosto de 2017 30 / 40
Sequência de Fibonacci
2 1
fibo(4)
1 1 1 0
fibo(3) fibo(2)
1 0
fibo(2) fibo(1) fibo(1) fibo(0)
fibo(1) fibo(0)
3 2
fibo(5)
2 1 1 1
fibo(4) fibo(3)
1 1 1 0 1 0
fibo(3) fibo(2) fibo(2) fibo(1)
1 0
fibo(2) fibo(1) fibo(1) fibo(0) fibo(1) fibo(0)
fibo(1) fibo(0)
φ = 1.6180339887498948482...
φ = 1.6180339887498948482...
φ = 1.6180339887498948482...
Solução recursiva!
φ = 1 + 1/φ
Vamos ao código!
1 Recursão
O que é recursão?
Dividir para conquistar
Algoritmos recursivos vs Algoritmos iterativos
2 Exemplos
Exemplo: sequência de Fibonacci
Exemplo: Backtracking
O que é?
Backtracking refere-se a um tipo de algoritmo para encontrar todas (ou
algumas) soluções de um problema computacional, que
incrementalmente constrói candidatas de soluções e abandona
uma candidata parcialmente construída tão logo quanto for
possível determinar que ela não pode gerar uma solução válida.
O que é?
Backtracking refere-se a um tipo de algoritmo para encontrar todas (ou
algumas) soluções de um problema computacional, que
incrementalmente constrói candidatas de soluções e abandona
uma candidata parcialmente construída tão logo quanto for
possível determinar que ela não pode gerar uma solução válida.
Quando aplicável
Frequentemente muito mais rápido que algoritmos de enumeração
total (força bruta), já que ele pode eliminar um grande número de
soluções inválidas com um único teste. Gera apenas soluções
válidas.
Vamos ao código!