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

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

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

Estrutura de Dados Conceitos Iniciais

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

Análise de Algoritmos Parte 4

Aula prática 5. Funções Recursivas

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

Algoritmos e Estruturas de Dados I

Revisão: Tipo Abstrato de Dados Recursividade

BCC202 - Estrutura de Dados I

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

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

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

Recursão. Prof. Cristiano André da Costa. [Versão de Março de 2000] Definição

Estruturas de Repetição

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

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

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

Métodos de Ordenação Parte 3

Linguagem de programação métodos/funções

Python: Recursão. Claudio Esperança

Tentativa e Erro (Backtracking)

Recursividade. Recursividade

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

Introdução à Computação II Unesp Rio Claro 2012Prof. Rafael Oliveira

Lista de Figuras Figura 1 1: Figura 1 2: Figura 1 3: Figura 1 4: Figura 1 5: Figura 1 6: Figura 1 7: Figura 2 1: Figura 2 2: Figura 2 3: Figura 2 4:

Algoritmos de Ordenação

Introdução à Programação. Vanessa Braganholo

Teoria da Computação. Aula 4 Técnicas de Análise 5COP096. Aula 4 Prof. Dr. Sylvio Barbon Junior. Sylvio Barbon Jr

Algoritmos e Estruturas de Dados I (DCC/003) Estruturas Condicionais e de Repetição

TCC 00308: Programação de Computadores I Introdução

Ordenação Externa. Ordenação Externa. Ordenação Externa. Ordenação Externa

Universidade Estadual de Mato Grosso do Sul Bacharelado em Ciência da Computação Algoritmos e Estruturas de Dados II Prof. Fabrício Sérgio de Paula

QuickSort. Estrutura de Dados II Jairo Francisco de Souza

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

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

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

Introdução à Programação

Aula 08 Estruturas de Condição. Disciplina: Fundamentos de Lógica e Algoritmos Prof. Bruno Gomes

LISTA DE EXERCÍCIOS MÊS 04

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

ALGORITMOS AVANÇADOS. UNIDADE III Algoritmo de Ordenação por Intercalação (Mergesort) Luiz Leão

SUBGERÊNCIA DE GESTÃO EDUCACIONAL PLANO DE CURSO

UNIVERSIDADE ESTADUAL PAULISTA Julio de Mesquita Filho" FACULDADE DE ENGENHARIA

Recursividade Exaustiva e Backtracking

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

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

Introdução à Programação Aula 16 Mais exemplos de recursão

Roteiro Prático Nº 13 Recursividade

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

Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo

Aula T19 BCC202 Pesquisa (Parte 1) Pesquisa Binária. Túlio Toffolo

LINGUAGEM C: FUNÇÕES FUNÇÃO 04/07/2017. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

Universidade Federal do ABC Avaliação Disciplina Turma Professor Data Instruções para a prova (leia antes de começar): SelectionSort selectonsortrec

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

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

INF1007: Programação 2 6 Ordenação de Vetores. 01/10/2015 (c) Dept. Informática - PUC-Rio 1

Processamento da Informação Teoria. Recursividade

05 Análise de Algoritmos (parte 4) SCC201/501 - Introdução à Ciência de Computação II

Universidade Federal de Uberlândia Faculdade de Computação. Estruturas de repetição

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

BC1424 Algoritmos e Estruturas de Dados I Aula 03: Recursão / Recursividade

Linguagem de Programação I. Aula 10 Funções

Exercícios Repetição

Algoritmos de ordenação Ordenação rápida ( Quicksort )

6. Pesquisa e Ordenação

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

Simulado de Linguagem de Programação Java

Árvores de Pesquisa. A árvore de pesquisa é uma estrutura de dados muito eficiente para armazenar informação.

Aula 1. Teoria da Computação III

Sintaxe Básica de Java Parte 2

5COP088. Aula 2 Linguagem Estruturada Prof. Dr. Sylvio Barbon Junior. Laboratório de Programação. Aula 2 Linguagem Estruturada

Programação Aplicada à Engenharia

a) Defina uma função para obter o máximo entre dois números

controle de fluxo repetições iterativas

Algoritmos e Estruturas de Dados I. Recursividade. Pedro O.S. Vaz de Melo

LINGUAGEM DE PROGRAMAÇÃO ESTRUTURADA CAPÍTULO 5 ESTRUTURAS DE REPETIÇÃO EM C#

Programação II. Árvores Binárias (Binary Trees) Bruno Feijó Dept. de Informática, PUC-Rio

ICET CURSO: Ciência da Computação e Sistemas de Informação (Estrutura de Dados) Estudos Disciplinares Campus: Data: / / Nome:

GFM015 Introdução à Computação. Algoritmos. Ilmério Reis da Silva UFU/FACOM

Programação: Vetores

Métodos. Utilizados para dividir o programa em subprogramas

PLANO DE DISCIPLINA DISCIPLINA: Algoritmos e Programação

Waldemar Celes e Roberto Ierusalimschy. 29 de Fevereiro de 2012

Instituto de Computação Programação de Computadores (TCC00326)

Compiladores Ambiente de Execução

ESTRUTURA DE DADOS (TCC )

Lista de Exercícios 1 Algoritmos, Pseudocódigo e Fluxograma

Técnicas de Programação II

Métodos de ordenação. Bubble sort:

Complexidade de Algoritmos

UNIDADE 4 ESTRUTURAS DE CONTROLE

Algoritmos de Enumeração

Universidade da Madeira. 1. Recursão. 3. Busca. Profa. Dra. Laura Rodríguez Estruturas de dados e algoritmos 2

Aula 10 Algoritmos e Funções Recursivas

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

CURSO DE ESTRUTURA DE DADOS MÓDULO: ALGORITMOS DE ORDENAÇÃO E PESQUISA PROFESSORA: DANIELA ELOISE FLÔR COLABORADORA: MARIA CAROLINA SILA VANUCHI

Transcrição:

Recursividade Objetivos do módulo Discutir o conceito de recursividade Mostrar exemplos de situações onde recursividade é importante Discutir a diferença entre recursividade e iteração O que é recursividade Tipicamente em Java os programas são estruturados como objetos que enviam mensagens uns aos outros através de seus métodos de uma forma disciplinada, hierárquica. public static void main(string[] args) { A a = new A(); C c = new C() B b = new B(c); a.metodoa(b);... public void metodoa(b b) { b.metodob(getc());... public void metodob(c c) { c.metodoc();... metodoa metodob metodoc metodoc metodob metodoa (pilha de execução) Quando um método de um objeto faz uma chamada a ele mesmo, dizemos que este método é recursivo. Um método recursivo é, na verdade, capaz de resolver o caso mais simples do problema que se busca solucionar, ou seja, o caso base. Em outras palavras, quando o

método é chamado para o caso base, ele retorna um resultado. Quando ele é chamado para resolver um caso mais complexo ele divide o problema em duas partes: Um pedaço que ele sabe resolver (caso base); Um pedaço que ele não sabe resolver por completo, mas sabe resolver uma parte, que na verdade lembra o problema original, só que em uma versão mais simples. Assim, neste momento o método chama ele mesmo para resolver a versão mais simples. Cada vez que o método chama ele mesmo, dizemos que ele deu um passo de recursão. A sequencia de chamadas ao método para problemas cada vez menores dele mesmo irá convergir para o caso base, para o qual o método tem uma solução e retornará um resultado, não sendo mais necessários passos de recursão. Vejamos um exemplo: o que é um diretório em um computador? Um diretório pode estar vazio, conter arquivos, ou conter outros diretórios (que por sua vez, enquanto diretório pode estar vazio, conter arquivos ou outros diretórios, que por sua vez...). Como faríamos para listar todos os arquivos de um diretório, incluindo os arquivos dos seus subdiretórios? Um método que recebe um diretório e lê os arquivos deste diretório Chamadas recursivas a este método precisariam ser realizadas sempre que um subdiretório for encontrado. O caminhamento em árvores é tipicamente uma atividade recursiva. listaarquivos(arquivo D) { for( Arquivo a : D ) { if( a.isdiretorio() ) { return listaarquivos(a); //chamada recursiva, para resolver um problema menor else { System.out.println(a.getNomeCompleto()); //caso base Outro exemplo: fatoriais Relembrando: n! = n. (n-1). (n-2).. 1; 1! = 0! =1 5! = 5. 4. 3. 2. 1 = 120 Podemos calcular isso de forma iterativa: public void fatorial( int numero ) { int fatorial = 1; for ( int i = numero; i >= 1; i-- ) fatorial *= i; Mas também podemos pensar no fatorial como um modelo recursivo: n! = n. (n-1)! 5! = 5. 4! Neste caso, teríamos uma solução diferente:

public void fatorial( int numero ) { if( numero <= 1 ) //testa se é caso base return 1; else //passo de recursão return numero * fatorial( numero - 1 ); Se chamamos fatorial(5) veja abaixo a sequencia de chamadas recursivas e o retorno de cada uma delas (imagem retirada de Deitel, Java: How to Program): Erro de recursão infinita: o programador escreve o passo de recursão incorreto, de forma que as chamadas recursivas nunca convergem para o caso base. Vamos fazer juntos o exemplo da série de Fibonacci? Vamos analisar a execução de Fibonacci(3); (o i-ésimo termo da série) Veja a explosão de chamadas recursivas. Escolhendo entre iteração e recursão Problemas que podem ser resolvidos recursivamente também podem ser resolvidos por iterações Se a solução é iterativa vamos usar comandos de repetição, como while, for, etc. Se a solução for recursiva vamos usar comandos de seleção, como if, switch, etc.

Ambos envolvem repetição, mas na solução recursiva ela aparece em chamadas repetidas do método. Ambas terminam, mas a condição de parada é diferente: Para a solução iterativa a condição de parada é a condição de parada do próprio comando de repetição, quando ela falha em ser verdade, a iteração para; Para a solução recursiva, a condição de parada ocorre quando o caso base é alcançado. A recursão tem muitas negativas, causando repetidas invocações do mecanismo e consequentemente seu overhead de execução. Maior tempo de processamento e/ou consumo de memória Por exemplo, na execução de Fibonacci(3) teríamos 5 chamadas do mecanismo para alcançar o resultado esperado; já para Fibonacci(6) teríamos 25 chamadas (custo de execução cresce exponencialmente, enquanto na abordagem iterativa o custo é linear) Então, por que escolher a recursão? uma abordagem recursiva é preferida quando for uma forma mais natural de resolver o problema, gerando um código mais fácil de entender e depurar Para alguns problemas uma abordagem iterativa não é clara. Isso é bem evidente em algoritmos complexos que necessitam do uso explícito de pilha. Ex. caminhamento em árvore e ordenação baseada em divisão e conquista (Quicksort) Porém, o importante é usar recursão com cautela! Exemplos da necessidade de recursão Exemplo simples de divisão e conquista: Régua fonte: http://www2.dcc.ufmg.br/livros/algoritmos/ Na divisão e conquista tem-se duas (ou mais) chamadas recursivas por passo de recursão Não é feito recomputação excessiva como ocorre no exemplo da série de fibonacci Cada chamada resolve metade do problema Muito usado na prática No problema da régua deseja-se desenhar marcas em uma régua As marcas ocorrem em uma determinada posição e altura Para cada centímetro na régua há uma marca no ponto do meio, marcas menores em intervalos de ¼, ainda menores em intervalor de ⅛ e assim por diante.

Usando a idéia da divisão e conquista: 1) fazer marcas em um intervalo, primeiro uma grande marca no meio que divide o intervalo em duas metades iguais.2) fazer a marca mais curta em cada metade, usando o mesmo procedimento. O algoritmo: Execução Outros exemplos: Quicksort O algoritmo de ordenação quicksort consiste de 3 fases: Divisão: Se a sequência S tem zero ou um elemento, retorne-a imediatamente; já está ordenada. Em qualquer outro caso, (S tem pelo menos dois elementos) escolha um elemento x de S,chamado de pivô. Assim, serão formadas 3 sequências: L (com os elementos de S menores do que x), E (com elementos de S iguais a x) e G (com elementos de S maiores do que x) Recursão: ordene as sequências L e G recursivamente.

Conquista: recomponha S concatenando os elementos de L, em seguida E e, por fim, os elementos de G. Animação: http://www.site.uottawa.ca/%7estan/csi2514/applets/sort/sort.html Ilustração: Outros exemplos: Torres de Hanói fonte: Deitel, Java: How to Program Problema clássico da ciência da computação diz a lenda... (http://pt.wikipedia.org/wiki/torre_de_han%c3%b3i) o objetivo é mover uma pilha de disco de um pino para outro, usando um pino intermediário, de modo que um disco maior nunca seja colocado sobre um disco menor

Algoritmo segue a idéia de que mover n discos pode ser visualizado em termos de mover somente n-1 discos: mova n-1 discos do pino 1 para o pino 2, utilizando o pino 3 como área de armazenamento intermediário mova o último disco (o maior) do pino 1 para o pino 3 mova os n-1 discos do pino 2 para o pino 3, utilizando o pino 1 como área de armazenamento temporário Exemplo de implementação:

Outros exemplos: Fractais Fractais são figuras geométricas que podem ser frequentemente geradas a partir de um padrão repetido recursiva e infinitamente. A figura é modificada aplicando o padrão a cada segmento da figura original Algoritmo: