of 27 /27
Recursividade Túlio Toffolo [email protected] www.toffolo.com.br BCC202 – Aula 08 Algoritmos e Estruturas de Dados I

Recursividade - Universidade Federal de Ouro Pretoparte_… · Recursividade Túlio Toffolo – [email protected] BCC202 – Aula 08 Algoritmos e Estruturas de Dados I

  • Author
    others

  • View
    1

  • Download
    0

Embed Size (px)

Text of Recursividade - Universidade Federal de Ouro Pretoparte_… · Recursividade Túlio Toffolo –...

  • 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?