Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
ricardo.marcacini@ufms.br Prof. Ricardo M. Marcacini Curso: Algoritmos e Programação IIAlgoritmos e Programação II Sistemas de Informação 2º Semestre / 2013 http://www.marcacini.com.br/ufms/ Aula 4 Algoritmos Recursivos Aplicação: Fractais Exemplos de Algoritmos Recursivos Complexidade de Algoritmos Recursivos Comparação: Iterativo VS Recursivo ALG2-04 2 Recursividade Um programa recursivo é um programa que chama a si mesmo Dentro do corpo de uma função (ou procedimento), chamar novamente a própria função (ou procedimento) ALG2-04 3 Recursividade Um programa recursivo é um programa que chama a si mesmo Dentro do corpo de uma função (ou procedimento), chamar novamente a própria função (ou procedimento) Um programa recursivo “mal formulado” realiza um loop infinito ALG2-04 4 Recursividade Um programa recursivo é um programa que chama a si mesmo Dentro do corpo de uma função (ou procedimento), chamar novamente a própria função (ou procedimento) Um programa recursivo “mal formulado” realiza um loop infinito Necessário uma condição de parada A condição de parada depende do problema ALG2-04 5 Recursividade O que acontece com os parâmetros e variáveis locais durante a recursão? Cada chamada da função tem seu próprio “escopo” Variáveis locais Parâmetros ALG2-04 6 Recursividade Como funciona a execução de algoritmos recursivos? ALG2-04 7 Recursividade Como funciona a execução de algoritmos recursivos? Cada chamada da função é tratada como um programa independente Quando uma função filha é chamada, a função pai é “congelada” e espera a execução Quando a função filha termina, a execução volta para a função pai Processo chamado de “Pilha de Execução” ALG2-04 8 Algoritmos Recursivos Vamos estudar em aula alguns exemplos implementados usando recursão Fatorial Somar elementos de um vetor Série de Fibonacci Divisão Recursiva Busca Sequencial Recursiva ALG2-04 9 Fatorial (recursivo) Entrada: Inteiro n Saída: Inteiro n! = n*(n-1)*(n-2)*(n-2)* … * 1 DUZAIR Typewritten text 3 ALG2-04 10 Fatorial (recursivo) Entrada: Inteiro n Saída: Inteiro n! = n*(n-1)*(n-2)*(n-2)* … * 1 Função int fatorial_recursivo(int n){ se(n <= 0) retornar 1; senão retornar n * fatorial_recursivo(n-1); } DUZAIR Typewritten text 3 ALG2-04 11 Soma recursiva de elementos do vetor Entrada: Inteiro n (tamanho do vetor) Vetor de inteiros v Saída: Inteiro (soma) ALG2-04 12 Soma recursiva de elementos do vetor Entrada: Inteiro n (tamanho do vetor) Vetor de inteiros v Saída: Inteiro (soma) Função int soma_recursiva(int n, int v[]){ se(n < 0) retornar 0; senão retornar v[n-1] + soma_recursiva(n-1,v); } DUZAIR Typewritten text = ALG2-04 13 Série de Fibonacci ALG2-04 14 Série de Fibonacci Função naturalmente recursiva... ALG2-04 15 Série de Fibonacci Função naturalmente recursiva... Função int fib(int n){ se(n < 2) retornar n; senão retornar fib(n-1)+fib(n-2); } ALG2-04 16 Divisão Recursiva Implementar e estudar o seguinte programa: ALG2-04 17 Busca Sequencial Recursiva Entrada: Número inteiro n≥0 (tamanho do vetor) Vetor v[0..n−1] com n números inteiros Um inteiro x (que desejamos buscar) Saída k no intervalo [0, n-1] tal que v[k] = x Obs: Se tal k não existe, devolve -1 ALG2-04 18 Busca Sequencial Recursiva ALG2-04 19 Complexidade de Algoritmos Recursivos Necessário verificar complexidade de espaço (memória) Pilha de execução Número de chamadas recursivas Exemplo: Fatorial ALG2-04 20 Complexidade de Algoritmos Recursivos Necessário verificar complexidade de espaço (memória) Pilha de execução Número de chamadas recursivas Exemplo: Fatorial Versão recursiva Tempo: O(n) Espaço: O(n) Versão iterativa Tempo: O(n) Espaço: O(1) ALG2-04 21 Complexidade de Algoritmos Recursivos Equação de recorrência T(n) é utilizada para ajudar na análise da complexidade Qual a equação de recorrência que descreve a complexidade da função fatorial? ALG2-04 22 Complexidade de Algoritmos Recursivos Equação de recorrência T(n) é utilizada para ajudar na análise da complexidade Qual a equação de recorrência que descreve a complexidade da função 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) ALG2-04 23 Quando usar recursão? Paradigma: dividir para conquistar Duas chamadas recursivas Cada uma resolve metade do problema Solução eficiente na prática Em muitas situações, recursividade é ineficiente Compare as versões iterativas e recursivas do Fibonacci! ALG2-04 24 Bibliografia ZIVIANI, N. Projeto de algoritmos com implementações em Java e C++. 1. ed. São Paulo: Thomson Learning, 2006. Projeto de Algoritmos – Cap.2 Paradigmas de Projeto de Algoritmos – Seção 2.2.2 Slide 1 Slide 2 Slide 3 Slide 4 Slide 5 Slide 6 Slide 7 Slide 8 Slide 9 Slide 10 Slide 11 Slide 12 Slide 13 Slide 14 Slide 15 Slide 16 Slide 17 Slide 18 Slide 19 Slide 20 Slide 21 Slide 22 Slide 23 Slide 24