Transcript
Page 1: Recursividade - Universidade Federal de Ouro Pretoparte_… · Recursividade Túlio Toffolo – tulio@toffolo.com.br  BCC202 – Aula 08 Algoritmos e Estruturas de Dados I

Recursividade Túlio Toffolo – [email protected] www.toffolo.com.br

BCC202 – Aula 08

Algoritmos e Estruturas de Dados I

Page 2: Recursividade - Universidade Federal de Ouro Pretoparte_… · Recursividade Túlio Toffolo – tulio@toffolo.com.br  BCC202 – Aula 08 Algoritmos e Estruturas de Dados I
Page 3: Recursividade - Universidade Federal de Ouro Pretoparte_… · Recursividade Túlio Toffolo – tulio@toffolo.com.br  BCC202 – Aula 08 Algoritmos e Estruturas de Dados I

Outros Exemplos de Recursividade

•  Factais são outros exemplos de recursividade

Page 4: Recursividade - Universidade Federal de Ouro Pretoparte_… · Recursividade Túlio Toffolo – tulio@toffolo.com.br  BCC202 – Aula 08 Algoritmos e Estruturas de Dados I

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)

Page 5: Recursividade - Universidade Federal de Ouro Pretoparte_… · Recursividade Túlio Toffolo – tulio@toffolo.com.br  BCC202 – Aula 08 Algoritmos e Estruturas de Dados I

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); }}

Page 6: Recursividade - Universidade Federal de Ouro Pretoparte_… · Recursividade Túlio Toffolo – tulio@toffolo.com.br  BCC202 – Aula 08 Algoritmos e Estruturas de Dados I

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);}

Page 7: Recursividade - Universidade Federal de Ouro Pretoparte_… · Recursividade Túlio Toffolo – tulio@toffolo.com.br  BCC202 – Aula 08 Algoritmos e Estruturas de Dados I

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); }}

Page 8: Recursividade - Universidade Federal de Ouro Pretoparte_… · Recursividade Túlio Toffolo – tulio@toffolo.com.br  BCC202 – Aula 08 Algoritmos e Estruturas de Dados I

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))

Page 9: Recursividade - Universidade Federal de Ouro Pretoparte_… · Recursividade Túlio Toffolo – tulio@toffolo.com.br  BCC202 – Aula 08 Algoritmos e Estruturas de Dados I

Recusão de exemplo

9

Exemplo(n) { if (n <= 1) "inspecione elemento" n e termine; else { for i = 0 to n "inspecione elemento" i; Exemplo(n-1); }}

Page 10: Recursividade - Universidade Federal de Ouro Pretoparte_… · Recursividade Túlio Toffolo – tulio@toffolo.com.br  BCC202 – Aula 08 Algoritmos e Estruturas de Dados I

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

Page 11: Recursividade - Universidade Federal de Ouro Pretoparte_… · Recursividade Túlio Toffolo – tulio@toffolo.com.br  BCC202 – Aula 08 Algoritmos e Estruturas de Dados I

•  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

Page 12: Recursividade - Universidade Federal de Ouro Pretoparte_… · Recursividade Túlio Toffolo – tulio@toffolo.com.br  BCC202 – Aula 08 Algoritmos e Estruturas de Dados I

Função de Complexidade

•  Exemplo de recorrência:

T(n) = n + T(n-1)

T(1) = 1

T(n) = n (n+1) / 2

Page 13: Recursividade - Universidade Federal de Ouro Pretoparte_… · Recursividade Túlio Toffolo – tulio@toffolo.com.br  BCC202 – Aula 08 Algoritmos e Estruturas de Dados I

Novo exemplo

13

int fatorial(int n) { if (n == 1) return 1; else { return n * fatorial(n-1); }}

Page 14: Recursividade - Universidade Federal de Ouro Pretoparte_… · Recursividade Túlio Toffolo – tulio@toffolo.com.br  BCC202 – Aula 08 Algoritmos e Estruturas de Dados I

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)

Page 15: Recursividade - Universidade Federal de Ouro Pretoparte_… · Recursividade Túlio Toffolo – tulio@toffolo.com.br  BCC202 – Aula 08 Algoritmos e Estruturas de Dados I

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?

Page 16: Recursividade - Universidade Federal de Ouro Pretoparte_… · Recursividade Túlio Toffolo – tulio@toffolo.com.br  BCC202 – Aula 08 Algoritmos e Estruturas de Dados I

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

Page 17: Recursividade - Universidade Federal de Ouro Pretoparte_… · Recursividade Túlio Toffolo – tulio@toffolo.com.br  BCC202 – Aula 08 Algoritmos e Estruturas de Dados I

Análise da Função Recursiva

•  Considere a seguinte função:

Pesquisa(n) { if (n <= 1) "inspecione elemento” n e termine; else { for i = 0 to n "inspecione elemento” i; Pesquisa(n/3) ; }}

Page 18: Recursividade - Universidade Federal de Ouro Pretoparte_… · Recursividade Túlio Toffolo – tulio@toffolo.com.br  BCC202 – Aula 08 Algoritmos e Estruturas de Dados I

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)

Page 19: Recursividade - Universidade Federal de Ouro Pretoparte_… · Recursividade Túlio Toffolo – tulio@toffolo.com.br  BCC202 – Aula 08 Algoritmos e Estruturas de Dados I

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

Page 20: Recursividade - Universidade Federal de Ouro Pretoparte_… · Recursividade Túlio Toffolo – tulio@toffolo.com.br  BCC202 – Aula 08 Algoritmos e Estruturas de Dados I

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)

Page 21: Recursividade - Universidade Federal de Ouro Pretoparte_… · Recursividade Túlio Toffolo – tulio@toffolo.com.br  BCC202 – Aula 08 Algoritmos e Estruturas de Dados I

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 = 2

k ) k = logn

Resolvendo por expansão temos:

T (2

k) = T (2

k�1

) + 1

= (T (2

k�2

) + 1) + 1

= (T (2

k�3

) + 1) + 1 + 1

... ...= (T (2) + 1) + 1 + · · · + 1

= (T (1) + 1) + 1 + · · · + 1

= 0 + 1 + · · · + 1| {z }k

= k

T (n) = logn

T (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 = 2

k ) k = logn

Resolvendo por expansão temos:

T (2

k) = T (2

k�1

) + 1

= (T (2

k�2

) + 1) + 1

= (T (2

k�3

) + 1) + 1 + 1

... ...= (T (2) + 1) + 1 + · · · + 1

= (T (1) + 1) + 1 + · · · + 1

= 0 + 1 + · · · + 1| {z }k

= k

T (n) = logn

T (n) = O(logn)

UFMG/ICEx/DCC Algoritmos e Estruturas de Dados II 111

Page 22: Recursividade - Universidade Federal de Ouro Pretoparte_… · Recursividade Túlio Toffolo – tulio@toffolo.com.br  BCC202 – Aula 08 Algoritmos e Estruturas de Dados I

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);}

Page 23: Recursividade - Universidade Federal de Ouro Pretoparte_… · Recursividade Túlio Toffolo – tulio@toffolo.com.br  BCC202 – Aula 08 Algoritmos e Estruturas de Dados I

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.

Page 24: Recursividade - Universidade Federal de Ouro Pretoparte_… · Recursividade Túlio Toffolo – tulio@toffolo.com.br  BCC202 – Aula 08 Algoritmos e Estruturas de Dados I

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));}

Page 25: Recursividade - Universidade Federal de Ouro Pretoparte_… · Recursividade Túlio Toffolo – tulio@toffolo.com.br  BCC202 – Aula 08 Algoritmos e Estruturas de Dados I

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);}

Page 26: Recursividade - Universidade Federal de Ouro Pretoparte_… · Recursividade Túlio Toffolo – tulio@toffolo.com.br  BCC202 – Aula 08 Algoritmos e Estruturas de Dados I

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);}

Page 27: Recursividade - Universidade Federal de Ouro Pretoparte_… · Recursividade Túlio Toffolo – tulio@toffolo.com.br  BCC202 – Aula 08 Algoritmos e Estruturas de Dados I

Perguntas?


Recommended