Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
David Menotti
Algoritmos e Estruturas de Dados I
DECOM UFOP
Conceito de Recursividade
Exemplos
Conceito poderoso
Renato Ferreira
David Menotti
Algoritmos e Estrutura
Recursividade
David Menotti
Algoritmos e Estrutura
Recursividade
David Menotti
Algoritmos e Estrutura
Condio de parada
Condio de parada
Objetivo
Renato Ferreira
David Menotti
Algoritmos e Estrutura
Recursividade
David Menotti
Algoritmos e Estrutura
Execuo
David Menotti
Algoritmos e Estrutura
Exemplo
Fat (int n) {
if (n<=0)
return 1;
else
return n * Fat(n-1);
}
Main() {
int f;
f = fat(5);
printf(%d,f);
}
David Menotti
Algoritmos e Estrutura
Complexidade
Ja no fatorial no recursivo
a complexidade de
espao O(1)
David Menotti
Fat (int n) {
int f;
f = 1;
while(n > 0){
f = f * n;
n = n 1;
}
return f;
}
Algoritmos e Estrutura
Recursividade
David Menotti
Algoritmos e Estrutura
Fibonacci
Fn = Fn-1 + Fn-2
n > 2,
F0 = F1 = 1
Fib(int n) {
if (n<2)
return 1;
else
return Fib(n-1) + Fib(n-2);
}
David Menotti
Algoritmos e Estrutura
Anlise da funo
Fibonacci
Ineficincia em Fibonacci
David Menotti
Algoritmos e Estrutura
Fibonacci no recursivo
int FibIter(int n) {
int i, k, F;
i = 1; F = 0;
for (k = 1; k <= n; k++) {
F += i;
i = F - i;
}
return F;
Complexidade: O(n)
Concluso: no usar recursividade
cegamente!
David Menotti
Algoritmos e Estrutura
David Menotti
Algoritmos e Estrutura
David Menotti
Algoritmos e Estrutura
Outros exemplos de
recursividade
void estrela(int x,int y, int r)
{
if ( r > 0 )
{
estrela(x-r, y+r, r div 2);
estrela(x+r, y+r, r div 2);
estrela(x-r, y-r, r div 2);
estrela(x+r, y-r, r div 2);
box(x, y, r);
}
}
David Menotti
Algoritmos e Estrutura
David Menotti
Algoritmos e Estrutura
Execuo: rgua
regua(0, 8, 3)
marca(4, 3)
regua(0, 4, 2)
marca(2, 2)
regua(0, 2, 1)
marca(1, 1)
regua(0, 1, 0)
regua(1, 2, 0)
regua(2, 4, 1)
marca(3, 1)
regua(2, 3, 0)
regua(3, 4, 0)
regua(4, 8, 2)
marca(6, 2)
regua(4, 6, 1)
marca(5, 1)
regua(4, 5, 0)
regua(5, 6, 0)
regua(6, 8, 1)
marca(7, 1)
regua(6, 7, 0)
regua(7, 8, 0)
David Menotti
Algoritmos e Estrutura
Anlise de Complexidade
O
Define-se uma funo de complexidade f(n)
desconhecida
David Menotti
Algoritmos e Estrutura
David Menotti
Algoritmos e Estrutura
Anlise de Funes
Recursivas
Alm da anlise de custo do tempo, deve-se
analisar tambm o custo de espao
David Menotti
Algoritmos e Estrutura
Anlise da Funo
Recursiva
Considere a seguinte funo:
Pesquisa(n)
{
(1) if (n <= 1)
(2)
inspecione elemento e termine;
else
{
(3)
para cada um dos n elementos inspecione elemento;
(4)
Pesquisa(n/3) ;
}
}
David Menotti
Algoritmos e Estrutura
Anlise da Funo
Recursiva
Qual a equao de recorrncia?
T(n) = n + T(n/3)
T(1) = 1
Dicas:
David Menotti
Algoritmos e Estrutura
Resolvendo a equao
1 n/3K = 1 n = 3K
David Menotti
Algoritmos e Estrutura
Resolvendo a Equao
Considerando que T(n/3K) = T(1) temos:
K-1
K-1
i) + T(1) = n (1/3i) + 1
T(n) =
(n/3
i=0
i=0
O(n)
Algoritmos e Estrutura
Exerccio
David Menotti
Algoritmos e Estrutura
Funo de Potncia
int pot(int base,Recursiva
int exp)
{
if (!exp)
return 1;
/* else */
return (base*pot(base, exp-1));
}
Anlise de complexidade:
T(0) = 1;
T(b,n) = 1 + T(b,n-1);
David Menotti
O(n)
Algoritmos e Estrutura
Exerccios
David Menotti
Algoritmos e Estrutura
Respostas
Pot(int n) {
if (n==0)
return 1;
else
return 2 * Pot(n-1);
}
David Menotti
Algoritmos e Estrutura