Recursividade. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

Documentos relacionados
Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP. Recursividade

ALGORITMOS AVANÇADOS UNIDADE II Recursividade. Luiz Leão

Análise de Algoritmos Parte 4

Recursividade. Túlio Toffolo BCC202 Aula 08 Algoritmos e Estruturas de Dados I

Recursividade. Prof. Jesus José de Oliveira Neto

Lista de Exercícios sobre Recursividade

Análise de Problemas Recursivos. Algoritmos e Estruturas de Dados Flavio Figueiredo (

Técnicas de análise de algoritmos

Prof. A. G. Silva. 25 de setembro de Prof. A. G. Silva INE5603 Introdução à POO 25 de setembro de / 35

Algoritmos e Estruturas de Dados I Linguagem C

Estrutura de Dados Conceitos Iniciais

Estruturas de Dados, Análise de Algoritmos e Complexidade Estrutural. Carlos Alberto Alonso Sanches

Recursão. Aula 1. Liana Duenha. Faculdade de Computação Universidade Federal de Mato Grosso do Sul

SCC Capítulo 2 Recursão

Algoritmos e Estruturas de Dados

Recursividade. Objetivos do módulo. O que é recursividade

Introdução a Algoritmos Parte 08

Estruturas de Dados Aula 14: Recursão

Estruturas de Dados Aula 14: Recursão 19/05/2011

Algoritmos e Estruturas de Dados

Análise e Complexidade de Algoritmos

Recursividade. Métodos iterativos. Prof. Cesar Augusto Tacla. Métodos iterativos utilizam estruturas de repetição

Introdução à Ciência da Computação II. Recursão. Prof. Ricardo J. G. B. Campello

Processamento da Informação

Programação Estruturada

Recursão. Prof. Fabrício Olivetti de França. (com inspirações do slide do prof. Rodrigo Hausen)

INF 1007 Programação II

Solução de Recorrências

Estruturas de Dados. Revisão de Funções e Recursão. Agradecimentos

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: funções

Roteiro Prático Nº 13 Recursividade

controle de fluxo repetições iterativas

Revisão: Tipo Abstrato de Dados Recursividade

Aula prática 5. Funções Recursivas

Algoritmos e Estruturas de Dados I

UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO CURSO: CIÊNCIA DA COMPUTAÇÃO. Prof.ª Danielle Casillo

Programação. Prof Marcelo Zorzan Prof a Melissa Zanatta

04 Recursão SCC201/501 - Introdução à Ciência de Computação II

SCC Capítulo 3 Análise de Algoritmos - Parte 2

Análise de Complexidade para algoritmos iterativos e recursivos

Estruturas de Dados. Módulo 4 Funções. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Recursividade. Estrutura de Dados. Prof. Kleber Rezende

Recursão David Déharbe

Aula 05: - Recursão (parte 1)

Centro Federal de Educação Tecnológica de Minas Gerais Programa de Pós-Graduação em Modelagem Matemática e Computacional

Fundamentos de programação

ANÁLISE DE ALGORITMOS: PARTE 4

Programação II. Introdução a Funções. Bruno Feijó Dept. de Informática, PUC-Rio

Técnicas de projeto de algoritmos: Indução

Universidade de São Paulo São Carlos Instituto de Ciências Matemáticas e de Computação. Recursão em C

Programação II RECURSÃO

PROGRAMAÇÃO DE COMPUTADORES V - TCC Modulo 6 : Funções Escopo de Variáveis: Globais x Locais Aura - Erick

INF 1005 Programação I

Lista 1 - PMR2300. Fabio G. Cozman 3 de abril de 2013

Programação Estruturada Prof. Rodrigo Hausen Recursão

SCC0601 Projeto de Algoritmos. Recursão

ESTRUTURA DE DADOS (TCC )

Introdução à Programação

Exercícios: Recursão

Permite modularidade (dividir programa em partes): Facilita a depuração (debug) e portabilidade.

Aula 05: - Recursão (parte 1)

COMPLEXIDADE DE ALGORITMOS

Recursividade. Recursividade

Suponha um conjunto habitacional, com várias famílias... imagina se todas elas morassem em uma única casa?

SCC0214 Projeto de Algoritmos

Relações de recorrência

Lista de Exercícios 06 Modularização (Procedimentos e Funções)

Pesquisa e Ordenação

Resposta pergunta 1: i n t dectobin ( i n t n ) { i n t mdc( i n t x, i n t y ) ; void testpalindromo ( ) ; i n t main ( ) { testmult ( ) ;

Medida do Tempo de Execução de um Programa. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

É interessante comparar algoritmos para valores grandes de n. Para valores pequenos de n, mesmo um algoritmo ineficiente não custa muito para ser

Recursão. Definição. Características. Recursividade 31/08/2010

INF1005: Programação 1. Repetições. 08/03/10 (c) Paula Rodrigues 1

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: funções

Programação I Aula 15 Definições recursivas

Programação I Aula 15 Definições recursivas Pedro Vasconcelos DCC/FCUP

Algoritmos de Ordenação

Módulo 7. Funções. Algoritmos e Estruturas de Dados I C++ (Rone Ilídio)

COMPLEXIDADE DE ALGORITMOS COMPLEXIDADE DE ALGORITMOS

Programação de Computadores II. Cap. 4 Funções

Aula 06: Análise matemática de algoritmos recursivos

Analise o código abaixo:

CES-11. Noções de complexidade de algoritmos. Complexidade de algoritmos. Avaliação do tempo de execução. Razão de crescimento desse tempo.

Algoritmos e Estruturas de Dados I 01/2013. Vetores e Recursividade. Pedro O.S. Vaz de Melo

Algoritmos e Estruturas de Dados I IEC012. Procedimentos e Funções. Prof. César Melo Todos os créditos para o professor Leandro Galvão

Introdução à Programação. Recursão

Algoritmos e Programação. AULA 21: Recursividade UNIVERSIDADE FEDERAL DE PELOTAS CENTRO DE DESENVOLVIMENTO TECNOLÓGICO CIÊNCIA DA COMPUTAÇÃO

Aula 05. Modularização Função Subrotina Recursividade

Capítulo 3: Repetições. Pontifícia Universidade Católica Departamento de Informática

LISTA DE EXERCÍCIOS MÊS 04

Suponha um conjunto habitacional, com várias famílias... imagina se todas elas morassem em uma única casa?

Projeto e Análise de Algoritmos Aula 4: Dividir para Conquistar ou Divisão e Conquista ( )

Recursividade Alguns problemas são definidos com base nos mesmos, ou seja, podem ser descritos por instâncias do próprio problema.

Subprogramas. Prof. Carlos Lopes

Análise de algoritmos

Processamento da Informação Teoria. Recursividade

Transcrição:

Recursividade David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

Conceito de Recursividade Fundamental em Matemática e Ciência da Computação Um programa recursivo é um programa que chama a si mesmo Uma função recursiva é definida em termos dela mesma Exemplos Números naturais, Função fatorial, Árvore Conceito poderoso Define conjuntos infinitos com comandos finitos Renato Ferreira

Recursividade A recursividade é uma estratégia que pode ser utilizada sempre que o cálculo de uma função para o valor n, pode ser descrita a partir do cálculo desta mesma função para o termo anterior (n-1). Exemplo Função fatorial: n! = n * (n-1) * (n-2) * (n-3) *...* 1 (n-1)! = (n-1) * (n-2) * (n-3) *...* 1 logo: n! = n * (n-1)!

Recursividade Definição: dentro do corpo de uma função, chamar novamente a própria função recursão direta: a função A chama a própria função A recursão indireta: a função A chama uma função B que, por sua vez, chama A

Condição de parada Nenhum programa nem função pode ser exclusivamente definido por si Um programa seria um loop infinito Uma função teria definição circular Condição de parada Permite que o procedimento pare de se executar F(x) > 0 onde x é decrescente Objetivo Estudar recursividade como ferramenta prática! Renato Ferreira

Recursividade Para cada chamada de uma função, recursiva ou não, os parâmetros e as variáveis locais são empilhados na pilha de execução.

Execução Internamente, quando qualquer chamada de função é feita dentro de um programa, é criado um Registro de Ativação na Pilha de Execução do programa O registro de ativação armazena os parâmetros e variáveis locais da função bem como o ponto de retorno no programa ou subprograma que chamou essa função. Ao final da execução dessa função, o registro é desempilhado e a execução volta ao subprograma que chamou a função

Exemplo int fat1(int n) { int r; if (n<=0) r = 1; else r = n*fat1(n-1); return r; int fat2(int n) { if (n<=0) return 1; else return n * fat2(n-1); void main() { int f; f = fatx(4); printf( %d,f);

Complexidade A complexidade de tempo do fatorial recursivo é O(n). (Em breve iremos ver a maneira de calcular isso usando equações de recorrência) Mas a complexidade de espaço também é O(n), devido a pilha de execução Ja no fatorial não recursivo a complexidade de espaço é O(1) Fat (int n) { int f; f = 1; while(n > 0){ f = f * n; n = n 1; return f;

Recursividade Portanto, a recursividade nem sempre é a melhor solução, mesmo quando a definição matemática do problema é feita em termos recursivos

Fibonacci Outro exemplo: Série de Fibonacci: F n = F n-1 + F n-2 n > 2, F 0 = 0 F 1 = 1 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89... int Fib(int n) { if (n<=0) return 0; else if ( n == 1) return 1; else return Fib(n-1) + Fib(n-2);

Análise da função Fibonacci Ineficiência em Fibonacci Termos F n-1 e F n-2 são computados independentemente Número de chamadas recursivas = número de Fibonacci! Custo para cálculo de F n O( n ) onde = (1 + 5)/2 = 1,61803... Golden ratio Exponencial!!!

Fibonacci não recursivo int FibIter(int n) { int i, k, F; i = 1; F = 0; for (k = 1; k <= n; k++) { F += i; i = F - i; return F; Complexidade: O(n) Conclusão: não usar recursividade cegamente!

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)

Dividir para Conquistar Duas chamadas recursivas Cada uma resolvendo a metade do problema Muito usado na prática Solução eficiente de problemas Decomposição Não se reduz trivialmente como fatorial Duas chamadas recursivas Não produz recomputação excessiva como fibonacci Porções diferentes do problema

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 estrela(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);

Exemplo simples: régua 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); Qual é a ordem de impressão das marcas?

Execução: régua 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)

Outra implementação: régua int regua2(int l,int r,int h) { int m; m = (l + r) / 2; marca(m,h); if ( h > 1 ) { regua(l, m, h 1); regua(m, r, h 1);

Análise de Complexidade 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))

Análise da Função Fatorial 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)

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

Análise da Função Recursiva Considere a seguinte função: Pesquisa(n) { (1) if (n <= 1) (2) inspecione elemento e termine; else { (3) para cada um dos n elementos inspecione elemento ; (4) Pesquisa(n/3) ;

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 Dicas: Pode fazer a simplificação de n será sempre divisível por 3 Somatório de uma PG finita: a 1 (1 q n )/(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/3 K = 1 n = 3 K

Resolvendo a Equação Considerando que T(n/3 K ) = T(1) temos: K-1 T(n) = Σ (n/3 i ) + T(1) = n Σ (1/3 i ) + 1 i=0 K-1 i=0 Aplicando a fórmula do somatório de uma PG finita (a 1 q n )/(1-q), temos: n (1 (1/3) K )/(1-1/3) + 1 n (1 (1/3 K ))/(1-1/3) + 1 n (1 (1/n))/(1-1/3) + 1 (n 1)/(2/3) + 1 3n/2 ½ O(n)

Exercício Crie uma função recursiva que calcula a potência de um número: Como escrever a função para o termo n em função do termo anterior? Qual a condição de parada? Qual a complexidade desta função?

Função de Potência Recursiva int pot(int base, int exp) { if (exp == 0) return 1; /* else */ return (base*pot(base, exp-1)); Análise de complexidade: T(b,0) = 1; T(b,n) = 1 + T(b,n-1); O(n)

Exercícios Implemente uma função recursiva para computar o valor de 2 n O que faz a função abaixo? void f(int a, int b) { // considere a > b if (b == 0) return a; else return f(b, a % b);

Respostas Pot(int n) { if (n==0) return 1; else return 2 * Pot(n-1); Algoritmo de Euclides. Calcula o MDC (máximo divisor comum) de dois números a e b