Author
others
View
1
Download
0
Embed Size (px)
Recursividade Túlio Toffolo – [email protected] www.toffolo.com.br
BCC202 – Aula 08
Algoritmos e Estruturas de Dados I
Outros Exemplos de Recursividade
• Factais são outros exemplos de recursividade
Quando vale a pena usar recursividade
• Recursividade vale a pena para Algoritmos complexos, cuja a implementação iterativa é complexa e normalmente requer o uso explícito de uma pilha
• Dividir para Conquistar (Ex. Quicksort) • Caminhamento em Árvores (pesquisa, backtracking)
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); }}
Outra implementação: estrela
void void estrela( y, int r){ if (r > 1) { estrela(x-r, y+r, r div 2); estrela(x+r, y+r, r 2); estrela(x-r, y-r, r div 2); estrela(x+r, y-r, r div 2); } box(x,y,r);}
Implementações de estrela
• Qual a melhor implementação?
7
void e2(int x,int y, int r){ if (r > 1) { 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);}
void e1(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); }}
Análise de Complexidade - Notação O
• Define-se uma função de complexidade f(n) desconhecida
• n mede o tamanho dos argumentos para o procedimento em questão
• Identifica-se a equação de recorrência T(n): • Especifica-se T(n) como uma função dos termos
anteriores
• Especifica-se a condição de parada (e.g. T(1))
Recusão de exemplo
9
Exemplo(n) { if (n
Função de Complexidade
• Exemplo de recorrência:
T(n) = n + T(n-1)
T(1) = 1
T(n) = n + T(n-1)
T(n) = n + (n-1) + T(n-2)
T(n) = n + (n-1) + (n-2) + T(n-3)
...
T(n) = n + (n-1) + (n-2) + ... + 2 + T(1)
T(n) = n + (n-1) + (n-2) + ... + 2 + 1
• Exemplo de recorrência:
T(n) = n + (n-1) + (n-2) + ... + 2 + 1
2 T(n) = n + (n-1) + (n-2) + ... + 2 + 1
+ 1 + 2 + 3 + ... + (n-1) + n
2 T(n) = (n+1) + (n+1) + (n+1) + ... + (n+1)
2 T(n) = n (n+1) Logo: T(n) = n (n+1) / 2
Função de Complexidade
Função de Complexidade
• Exemplo de recorrência:
T(n) = n + T(n-1)
T(1) = 1
T(n) = n (n+1) / 2
Novo exemplo
13
int fatorial(int n) { if (n == 1) return 1; else { return n * fatorial(n-1); }}
Análise da Função Fatorial
• Qual a equação de recorrência que descreve a complexidade da função fatorial vista?
T(n) = 1 + T(n-1)
T(1) = 1
T(n) = 1 + T(n-1)
T(n-1) = 1 + T(n-2)
T(n-2) = 1 + T(n-3)
...
T(2) = 1 + T(1)
Análise de Funções Recursivas
• Além da análise de custo do tempo, deve-se analisar também o custo de espaço
• Qual a complexidade de espaço da função fatorial (qual o tamanho da pilha de execução)?
• Proporcional ao número de chamadas?
Alguns somatórios úteis
16
Alguns somatórios úteis
nX
i=1
i =n(n + 1)
2
kX
i=0
2
k= 2
k+1 � 1
kX
i=0
1
2
i= 2�
1
2
k
kX
i=0
ai =ak+1 � 1
a� 1(a 6= 1)
nX
i=1
i2 =n(n + 1)(2n + 1)
6
UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 110
Análise da Função Recursiva
• Considere a seguinte função:
Pesquisa(n) { if (n
Análise da Função Recursiva
• Qual a equação de recorrência?
T(n) = n + T(n/3)
T(1) = 1
• Resolva a equação de recorrência: • Pode fazer a simplificação de que n será sempre
divisível por 3
• Somatório de uma PG finita: a1(1– qn)/(1-q)
Resolvendo a Equação
• Substitui-se os termos T(k), k < n, até que todos os termos T(k), k > 1, tenham sido substituídos por fórmulas contendo apenas T(1).
1 → n/3K = 1 → n = 3K 1
Resolvendo a Equação
Considerando que T(n/3K) = T(1) temos:
T(n) = Σ (n/3i) + T(1) = n Σ (1/3i) + 1 Aplicando a fórmula do somatório de uma PG finita
(a1 – qn)/(1-q), temos:
n (1 – (1/3)K)/(1 -1/3) + 1 n (1 – (1/3K))/(1 -1/3) + 1 n (1 – (1/n))/(1 -1/3) + 1 (n – 1)/(2/3) + 1 3n/2 – ½
i=0
K-1
i=0
K-1
O(n)
Algumas recorrências básicas
21
Algumas recorrências básicas: Caso 1
T (n) = T (n2
) + 1 (n � 2)T (1) = 0 (n = 1)
Vamos supor que:
n = 2k ) k = logn
Resolvendo por expansão temos:
T (2k) = T (2k�1) + 1= (T (2k�2) + 1) + 1= (T (2k�3) + 1) + 1 + 1
... ...= (T (2) + 1) + 1 + · · · + 1= (T (1) + 1) + 1 + · · · + 1= 0 + 1 + · · · + 1| {z }
k
= k
T (n) = lognT (n) = O(logn)
UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 111
Algumas recorrências básicas: Caso 1
T (n) = T (n2
) + 1 (n � 2)T (1) = 0 (n = 1)
Vamos supor que:
n = 2k ) k = logn
Resolvendo por expansão temos:
T (2k) = T (2k�1) + 1= (T (2k�2) + 1) + 1= (T (2k�3) + 1) + 1 + 1
... ...= (T (2) + 1) + 1 + · · · + 1= (T (1) + 1) + 1 + · · · + 1= 0 + 1 + · · · + 1| {z }
k
= k
T (n) = lognT (n) = O(logn)
UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 111
Outro exemplo de Pesquisa
22
int Pesquisa(int vetor[], int x, int ini, int fim) { if (ini > fim) return -1; int meio = (ini+fim)/2; if (vetor[meio] == x) return meio; else if (vetor[meio] < x) return Pesquisa(vetor, x, meio+1, fim); else if (vetor[meio] > x) return Pesquisa(vetor, x, ini, meio-1);}
Exercício
• Crie uma função recursiva que calcula a potência de um número: • Qual a condição de parada?
• Qual a complexidade de tempo desta função? • Apresente a equação de recorrência e resolva-a.
Função de Potência Recursiva
Análise de complexidade:
T(b, 0) = 1; T(b, n) = 1 + T(b, n-1);
O(n)
int pot(int base, int exp){ if (exp == 0) return 1; /* else */ return (base*pot(base, exp-1));}
Exercícios
• Implemente uma função recursiva para computar o valor de 2n
• Indique e resolva a equação de recorrência da função abaixo. Qual sua complexidade assintótica?
void f(int a, int b) { // considere b >= 0 if (b == 0) return a; else return f(a+a, b-1);}
Respostas
•
• Algoritmo de Euclides. Calcula o MDC (máximo divisor comum) de dois números a e b
Pot(int n) { if (n==0) return 1; else return 2 * Pot(n-1);}
Perguntas?