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