Você está na página 1de 8

Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.

2 8
Recursividade
Um procedimento que chama a si mesmo,
direta ou indiretamente, dito ser recursivo.
Recursividade permite descrever algoritmos
de forma mais clara e concisa, especialmente
problemas recursivos por natureza ou que
utilizam estruturas recursivas.
Ex.: rvore binria de pesquisa:
Todos os registros com chaves menores
esto na subrvore esquerda;
Todos os registros com chaves maiores
esto na subrvore direita.
2 4 6
3 7
5
1
type Registro = record Chave: integer ; end;
Apontador = ^Nodo;
Nodo = record
Reg: Registro;
Esq, Dir : Apontador;
end;
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.2 9
Recursividade
Algoritmo para percorrer todos os registros
em ordem de caminhamento central:
1. caminha na subrvore esquerda na ordem
central;
2. visita a raiz;
3. caminha na subrvore direita na ordem
central.
No caminhamento central, os nodos so
visitados em ordem lexicogrca das chaves.
procedure Central (p : Apontador ) ;
begin
i f p <> ni l
then begin
Central (p^.Esq) ;
writeln(p^.Reg.Chave) ;
Central (p^. Dir ) ;
end;
end;
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.2.1 10
Implementao de Recursividade
Usa-se uma pilha para armazenar os dados
usados em cada chamada de um
procedimento que ainda no terminou.
Todos os dados no globais vo para a pilha,
registrando o estado corrente da computao.
Quando uma ativao anterior prossegue, os
dados da pilha so recuperados.
No caso do caminhamento central:
para cada chamada recursiva, o valor de
e o endereo de retorno da chamada
recursiva so armazenados na pilha.
Quando encontra pnil o procedimento
retorna para quem chamou utilizando o
endereo de retorno que est no topo da
pilha.
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.2.1 11
Problema de Terminao em
Procedimentos Recursivos
Procedimentos recursivos introduzem a
possibilidade de iteraes que podem no
terminar: existe a necessidade de considerar
o problema de terminao.
fundamental que a chamada recursiva a um
procedimento esteja sujeita a uma
condio , a qual se torna no-satisfeita em
algum momento da computao.
Esquema para procedimentos recursivos:
composio de comandos

e .
if then


Para demonstrar que uma repetio termina,
dene-se uma funo , sendo o
conjunto de variveis do programa, tal que:
1. implica na condio de
terminao;
2. decrementada a cada iterao.
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.2.1 12
Problema de Terminao em
Procedimentos Recursivos
Uma forma simples de garantir terminao
associar um parmetro para (no caso por
valor) e chamar recursivamente com .
A substituio da condio por
garante terminao.
if then


necessrio mostrar que o nvel mais
profundo de recurso nito, e tambm
possa ser mantido pequeno, pois cada
ativao recursiva usa uma parcela de
memria para acomodar as variveis.
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.2.2 13
Quando No Usar Recursividade
Nem todo problema de natureza recursiva
deve ser resolvido com um algoritmo
recursivo.
Estes podem ser caracterizados pelo
esquema if then
Tais programas so facilmente transformveis
em uma verso no recursiva

while do
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.2.2 14
Exemplo de Quando No Usar
Recursividade
Clculo dos nmeros de Fibonacci

para
Soluo:

, onde

a razo de ouro.
O procedimento recursivo obtido diretamente
da equao o seguinte:
function FibRec(n: integer ) : integer;
begin
i f n < 2
then FibRec : = n
else FibRec : = FibRec(n1) + FibRec(n2);
end;
O programa extremamente ineciente
porque recalcula o mesmo valor vrias vezes.
Neste caso, a complexidade de espao para
calcular

.
Considerando que a medida de complexidade
de tempo o nmero de adies, ento

.
Projeto de Algoritmos Cap.2 Paradigmas de Projeto de Algoritmos Seo 2.2.2 15
Verso iterativa do Clculo de
Fibonacci
function Fi bIter (n: integer ) : integer;
var i , k, F: integer;
begin
i : = 1; F :=0;
for k : = 1 to n do
begin
F : = i + F;
i : = F i ;
end;
Fi bIter : = F;
end;
O programa tem complexidade de tempo
e complexidade de espao .
Devemos evitar uso de recursividade quando
existe soluo bvia por iterao.
Comparao verses recursiva e iterativa:
20 30 50 100
Recursiva 1 seg 2 min 21 dias

anos
Iterativa 1/3 mseg 1/2 mseg 3/4 mseg 1,5 mseg

Você também pode gostar