of 29 /29
Aula 6 - Recursividade David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP

Aula 6 - Recursividade David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP

Embed Size (px)

Text of Aula 6 - Recursividade David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP

  • Slide 1
  • Aula 6 - Recursividade David Menotti Algoritmos e Estruturas de Dados I DECOM UFOP
  • Slide 2
  • David Menotti Algoritmos e Estrutura de Dados I Conceito de Recursividade Fundamental em Matemtica e Cincia da Computao Um programa recursivo um programa que chama a si mesmo Uma funo recursiva definida em termos dela mesma Exemplos Nmeros naturais, Funo fatorial, rvore Conceito poderoso Define conjuntos infinitos com comandos finitos Renato Ferreira
  • Slide 3
  • David Menotti Algoritmos e Estrutura de Dados I Recursividade A recursividade uma estratgia que pode ser utilizada sempre que o clculo de uma funo para o valor n, pode ser descrita a partir do clculo desta mesma funo para o termo anterior (n-1). Exemplo Funo fatorial: n! = n * (n-1) * (n-2) * (n-3) *....* 1 (n-1)! = (n-1) * (n-2) * (n-3) *....* 1 logo: n! = n * (n-1)!
  • Slide 4
  • David Menotti Algoritmos e Estrutura de Dados I Recursividade Definio: dentro do corpo de uma funo, chamar novamente a prpria funo recurso direta: a funo A chama a prpria funo A recurso indireta: a funo A chama uma funo B que, por sua vez, chama A
  • Slide 5
  • David Menotti Algoritmos e Estrutura de Dados I Condio de parada Nenhum programa nem funo pode ser exclusivamente definido por si Um programa seria um loop infinito Uma funo teria definio circular Condio de parada Permite que o procedimento pare de se executar F(x) > 0 onde x decrescente Objetivo Estudar recursividade como ferramenta prtica! Renato Ferreira
  • Slide 6
  • David Menotti Algoritmos e Estrutura de Dados I Recursividade Para cada chamada de uma funo, recursiva ou no, os parmetros e as variveis locais so empilhados na pilha de execuo.
  • Slide 7
  • David Menotti Algoritmos e Estrutura de Dados I Execuo Internamente, quando qualquer chamada de funo feita dentro de um programa, criado um Registro de Ativao na Pilha de Execuo do programa O registro de ativao armazena os parmetros e variveis locais da funo bem como o ponto de retorno no programa ou subprograma que chamou essa funo. Ao final da execuo dessa funo, o registro desempilhado e a execuo volta ao subprograma que chamou a funo
  • Slide 8
  • David Menotti Algoritmos e Estrutura de Dados I Exemplo Fat (int n) { if (n
  • David Menotti Algoritmos e Estrutura de Dados I Complexidade A complexidade de tempo do fatorial recursivo O(n). (Em breve iremos ver a maneira de calcular isso usando equaes de recorrncia) Mas a complexidade de espao tambm O(n), devido a pilha de execuo Ja no fatorial no recursivo a complexidade de espao O(1) Fat (int n) { int f; f = 1; while(n > 0){ f = f * n; n = n 1; } return f; }
  • Slide 10
  • David Menotti Algoritmos e Estrutura de Dados I Recursividade Portanto, a recursividade nem sempre a melhor soluo, mesmo quando a definio matemtica do problema feita em termos recursivos
  • Slide 11
  • David Menotti Algoritmos e Estrutura de Dados I Fibonacci Outro exemplo: Srie de Fibonacci: F n = F n-1 + F n-2 n > 2, F 0 = F 1 = 1 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89... Fib(int n) { if (n
  • David Menotti Algoritmos e Estrutura 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); }
  • Slide 17
  • David Menotti Algoritmos e Estrutura de Dados I Exemplo simples: rgua int regua(int l,int r,int h) { int m; if ( h > 0 ) { m = (l + r) / 2; marca(m, h); regua(l, m, h 1); regua(m, r, h 1); }
  • Slide 18
  • David Menotti Algoritmos e Estrutura de Dados I 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)
  • Slide 19
  • David Menotti Algoritmos e Estrutura de Dados I Anlise de Complexidade O Define-se uma funo de complexidade f(n) desconhecida n mede o tamanho dos argumentos para o procedimento em questo Identifica-se a equao de recorrncia T(n): Especifica-se T(n) como uma funo dos termos anteriores Especifica-se a condio de parada (e.g. T(1))
  • Slide 20
  • David Menotti Algoritmos e Estrutura de Dados I Anlise da Funo Fatorial Qual a equao de recorrncia que descreve a complexidade da funo fatorial? 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)
  • Slide 21
  • David Menotti Algoritmos e Estrutura de Dados I Anlise de Funes Recursivas Alm da anlise de custo do tempo, deve-se analisar tambm o custo de espao Qual a complexidade de espao da funo fatorial (qual o tamanho da pilha de execuo)?
  • Slide 22
  • David Menotti Algoritmos e Estrutura de Dados I Anlise da Funo Recursiva Considere a seguinte funo: Pesquisa(n) { (1) if (n
  • David Menotti Algoritmos e Estrutura de Dados I Exerccios Implemente uma funo recursiva para computar o valor de 2 n O que faz a funo abaixo? void f(int a, int b) { // considere a > b if (b = 0) return a; else return f(b, a % b); }
  • Slide 29
  • David Menotti Algoritmos e Estrutura de Dados I Respostas Algoritmo de Euclides. Calcula o MDC (mximo divisor comum) de dois nmeros a e b Pot(int n) { if (n==0) return 1; else return 2 * Pot(n-1); }