Recursividade
Estrutura de Dados
Definição
Um algoritmo é dito recursivo quando ele chama
a si mesmo ou chama uma seqüência de outros
algoritmos, e um deles chama novamente o
primeiro algoritmo.
Estrutura de Dados
Recursividade
Divisão do problema original em pequenas
ocorrências
Dividir para conquistar (divide and conquer)
A dificuldade não está só no reconhecimento das
situações
Mas também no equilíbrio entre espaço
(memória ocupada) e tempo (tempo de
execução)
E manter ao mesmo tempo uma boa
compreensão da solução do problema
Estrutura de Dados
A função fatorial
n! = n x (n-1) x . . .x 1
Uma definição mais precisa
se n 0
1
n!
n * (n - 1)! se n 0
Calculando 4 ! usando a última definição, faríamos:
4! = 4 x 3!
= 4 x (3 x 2!)
= 4 x (3 x (2 x 1))
= 4 x (3 x (2 x (1 x 0!))).
= 4 x (3 x (2 x (1 x 1)))
= 4 x (3 x (2 x 1))
= 4 x (3 x 2)
=4x6
= 24
Estrutura de Dados
Todo processo recursivo
consiste de duas partes
Solução trivial:
Dada por definição, obtida sem recursão.
Solução geral:
Parte do problema que em essência é igual ao
problema original, sendo porém menor.
Estrutura de Dados
Versão recursiva para calcular o
fatorial
/*
fatorial
Pré-condição
Pós-condição
*/
: versão recursiva
: n é um inteiro não negativo
: retorna o valor do fatorial de n
int fatorial(int n)
{
if(n == 0)
return 1;
else
return n*fatorial(n-1);
}
Estrutura de Dados
Chamando a função: fatorial(3)
Estrutura de Dados
Utilizando árvore de recursão
float ex(float a, float b)
{
if (a >= b)
return((a+b)/2);
else
return(ex(ex(a+2,b-1),ex(a+1, b-2)));
}
Estrutura de Dados
Utilizando árvore de recursão
Estrutura de Dados
Rotinas recursivas e pilhas
Controle de chamadas e retornos de rotinas com
pilha
Quando uma rotina é chamada, empilha-se o
endereço de retorno + todas as variáveis locais
Quando ocorre o retorno da rotina, as variáveis
locais que foram criadas deixam de existir
Estrutura de Dados
Observações sobre um
algoritmo recursivo
Pode ser conciso e elegante
Pode ser difícil a compreensão dos detalhes de seu
funcionamento computacional
Pode requerer um exaustivo acompanhamento do
programa
O computador pode utilizar pilhas para esse controle
A mente humana não é tão boa para tais tarefas
Parece ser difícil para uma pessoa guardar uma longa
seqüência de resultados e então voltar para terminar um
trabalho
Estrutura de Dados
Para facilitar o acompanhamento,
podemos utilizar
Ilustrações especiais
Árvores de Recursão
Estrutura de Dados
Alguns resultados
mdc (6,12) = 6
mdc (12,20) = 4
mdc (20,24) = 4
Estrutura de Dados
Desenvolvendo algoritmos
recursivos
Ache o passo chave
Ache uma regra de parada
Como este problema pode ser dividido?
Como posso desenvolver o passo chave da solução?
Uma regra de parada indica que o problema ou uma parte
razoável do mesmo foi feito
Ela é geralmente pequena e dá a solução trivial, sem a
necessidade da recursão
Monte seu algoritmo
Combine a regra de parada e o “passo chave” usando uma
instrução if
Estrutura de Dados
Desenvolvendo algoritmos
recursivos
Verifique o término
Certificar que a recursão sempre terminará
Comece com uma situação geral
Verifique se num número finito de passos, a regra de
parada será satisfeita e a recursão termina
Desenhe uma árvore de recursão
É a ferramenta chave para analisar algoritmos
recursivos
Estrutura de Dados