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

Recursividade em C

Embed Size (px)

Text of Recursividade em C

  • 1. Aula 6 - Recursividade David Menotti Algoritmos e Estruturas de Dados I DECOM UFOP

2. Algoritmos e Estrutura de Dados I David Menotti 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 3. Algoritmos e Estrutura de Dados I David Menotti 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)! 4. Algoritmos e Estrutura de Dados I David Menotti 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 5. Algoritmos e Estrutura de Dados I David Menotti 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 6. Algoritmos e Estrutura de Dados I David Menotti Recursividade Para cada chamada de uma funo, recursiva ou no, os parmetros e as variveis locais so empilhados na pilha de execuo. 7. Algoritmos e Estrutura de Dados I David Menotti 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 8. Algoritmos e Estrutura de Dados I David Menotti Exemplo Fat (int n) { if (n 0){ f = f * n; n = n 1; } return f; } 10. Algoritmos e Estrutura de Dados I David Menotti Recursividade Portanto, a recursividade nem sempre a melhor soluo, mesmo quando a definio matemtica do problema feita em termos recursivos 11. Algoritmos e Estrutura de Dados I David Menotti Fibonacci Outro exemplo: Srie de Fibonacci: Fn = Fn-1 + Fn-2 n > 2, F0 = F1 = 1 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89... Fib(int n) { if (n 0 ) { m = (l + r) / 2; marca(m, h); regua(l, m, h 1); regua(m, r, h 1); } } 18. Algoritmos e Estrutura de Dados I David Menotti 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) 19. Algoritmos e Estrutura de Dados I David Menotti 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)) 20. Algoritmos e Estrutura de Dados I David Menotti 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) 21. Algoritmos e Estrutura de Dados I David Menotti 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)? 22. Algoritmos e Estrutura de Dados I David Menotti Anlise da Funo Recursiva Considere a seguinte funo: Pesquisa(n) { (1) if (n 1, tenham sido substitudos por frmulas contendo apenas T(1). 1 n/3K = 1 n = 3K 1 25. Algoritmos e Estrutura de Dados I David Menotti Resolvendo a Equao Considerando que T(n/3K ) = T(1) temos: T(n) = (n/3i ) + T(1) = n (1/3i ) + 1 Aplicando a frmula do somatrio de uma PG finita (a0 rn )/(1-r), 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) 26. Algoritmos e Estrutura de Dados I David Menotti Exerccio Crie uma funo recursiva que calcula a potncia de um nmero: Como escrever a funo para o termo n em funo do termo anterior? Qual a condio de parada? Qual a complexidade desta funo? 27. Algoritmos e Estrutura de Dados I David Menotti Funo de Potncia Recursiva int pot(int base, int exp) { if (!exp) return 1; /* else */ return (base*pot(base, exp-1)); } Anlise de complexidade: T(0) = 1; T(b,n) = 1 + T(b,n-1); O(n) 28. Algoritmos e Estrutura de Dados I David Menotti Exerccios Implemente uma funo recursiva para computar o valor de 2n 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); } 29. Algoritmos e Estrutura de Dados I David Menotti 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); }