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

Documentos relacionados
Estruturas de Dados Aula 14: Recursão

Fontes Bibliográficas. Estruturas de Dados Aula 14: Recursão. Introdução. Introdução (cont.)

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

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

Programação Estruturada

Instituto de C. Linguagem C: Listas. Luis Martí Instituto de Computação Universidade Federal Fluminense -

Módulo 10 Listas Encadeadas

Processamento da Informação

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

Estruturas de Dados Aula 10: Listas (parte 2) 19/04/2011

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

Estrutura de Dados Conceitos Iniciais

SCC Capítulo 2 Recursão

Estruturas de Dados Aula 11: TAD Pilha

Algoritmos e Estruturas de Dados I Linguagem C

Recursividade. Prof. Jesus José de Oliveira Neto

INF1007: Programação 2 8 Listas Encadeadas. (c) Dept. Informática - PUC-Rio 1

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

Estruturas de Dados Aula 16: Árvores com Número Variável 13/06/2011

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

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

Recursão David Déharbe

Universidade Estadual Paulista Júlio de Mesquita Filho UNESP

Algoritmos e Estruturas de Dados I

Algoritmos e Estruturas de Dados

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

Métodos Computacionais. Listas Encadeadas

Algoritmos e Estruturas de Dados

Aula 21 - Algoritmos e Funções Recursivas

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

Universidade Federal do ABC Programação Estruturada Fabrício Olivetti França Lista de Exercícios 02

Análise e Complexidade de Algoritmos

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

Programação II. Listas Encadeadas (Linked Lists) Bruno Feijó Dept. de Informática, PUC-Rio

Fontes Bibliográficas. Estruturas de Dados Aula 15: Árvores. Livros:

Análise de Algoritmos Parte 4

Recursividade UFOP 1/48

Análise de Complexidade para algoritmos iterativos e recursivos

Recursividade. Recursividade

Revisão: Tipo Abstrato de Dados Recursividade

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

Nível da Arquitetura do Conjunto das Instruções

ALGORITMOS E ESTRUTURAS DE DADOS CES-11 Prof. Paulo André Castro Sala 110 Prédio da Computação IECE - ITA

LISTA DE EXERCÍCIOS MÊS 04

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

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

Estruturas de Dados Aulas 3 e 4: Uso da. 14/03/2011 e 16/03/2011

Python: Recursão. Claudio Esperança

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

Roteiro Prático Nº 13 Recursividade

Aula 10 Algoritmos e Funções Recursivas

SCC0214 Projeto de Algoritmos

Algoritmos e Funções Recursivas

MC102 Aula 26. Instituto de Computação Unicamp. 17 de Novembro de 2016

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

Aula 16: Laços aninhados e desvios

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

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

Pesquisa em Memória Primária Hashing

Ordenação: QuickSort. Prof. Túlio Toffolo BCC202 Aula 15 Algoritmos e Estruturas de Dados I

BCC202 - Estrutura de Dados I

Organizam dados de forma hierárquica. Acontecem com frequência na natureza. Fáceis de representar e manipular com computadores

Edital de Seleção 053/2016 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões

AVALIAÇÃO DE CONHECIMENTO ESPECÍFICO

Estrutura de Dados e Algoritmos e Programação e Computadores II. Aula 4: Listas Estáticas e Dinâmicas

Universidade Federal de Santa Maria Colégio Agrícola de Frederico Westphalen Curso Superior de Tecnologia em Sistemas para Internet

Algoritmos e Funções Recursivas

REVISÃO DE PILHAS E FILAS. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Algoritmos e Estruturas de dados

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

Introdução Paradigmas

Aula prática 5. Funções Recursivas

Introdução a Programação. Tipos Abstratos de Dados Implementando Pilha e Fila

Projeto e Análise de Algoritmos

# Estrutura de Dados # Aula 08 Recursão (conceito, utilização, exemplos) Prof. Leinylson Fontinele Pereira

MC102 Aula 27 Recursão II

INF 1010 Estruturas de Dados Avançadas

INF 1620 P2-23/10/04 Questão 1 Nome:

AED2 - Aula 11 Problema da separação e quicksort

Introdução à Programação / Programação I

Hoje. mais análise de algoritmos: algoritmo de Euclides mais recursão: curvas de Hilbert

ORDENAÇÃO POR INTERCALAÇÃO

ÁRVORES ABB (ÁRVORES BINÁRIAS DE BUSCAS) Sérgio Carlos Portari Júnior

Fundamentos de programação

Arvores binárias. Fonte: PF 14 pf/algoritmos/aulas/bint.html

Lista de Exercícios sobre Recursividade

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

Edital de Seleção 024/2017 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões

INF 1005 Programação I

Programação científica C++

Pensamento Recursivo. O Objeto Carro. O Objeto Carro. O Objeto Carro. O Objeto Carro. O Objeto Carro

Edital de Seleção 032/2016 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões

Técnicas de análise de algoritmos

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 ESTADUAL PAULISTA Julio de Mesquita Filho" FACULDADE DE ENGENHARIA

Introdução à Programação / Programação I

Transcrição:

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

Fontes Bibliográficas Livros: Projeto de Algoritmos (Nivio Ziviani): Capítulo 2; Estruturas de Dados e seus Algoritmos (Szwarefiter, et. al): Capítulo 1; Algorithms in C (Sedgewick): Capítulo 5; Slides baseados nas aulas de Sedgewick (http://www.cs.princeton.edu/~rs/)

Introdução O que é recursão? É um método de programação no qual uma função pode chamar a si mesma O termo é usado de maneira mais geral para descrever o processo de repetição de um objeto de um jeito similar ao que já fora mostrado Por que precisamos aprender recursão? Paradigma de programação poderoso Nova maneira de pensar Muitas estruturas têm natureza recursiva: Estruturas encadeadas Fatorial, máximo divisor comum Uma pasta que contém outras pastas e arquivos

Introdução (cont.) Uma forma visual de recursão conhecida como efeito Droste

Introdução (cont.)

Máximo Divisor Comum mdc (p, q): encontre o maior divisor comum entre p e q; Ex.: mdc (4032, 1272) = 24 4032 = 2 6 x 3 2 x 7 1 1272 = 2 3 x 3 1 x 53 1 Uso de mdc: Simplificação de frações: 1272/4032 = 53/168 Importante em mecanismos de criptografia

Máximo Divisor Comum (2) Algoritmo de Euclides mdc (p, q) = p se q =0 mdc (q, p%q) caso contrario - caso base - passo de redução, converge para o caso base mdc (4032, 1272) = mdc (1272, 216) mdc (216, 192) mdc (192, 24) mdc (24, 0) 24-4032 / 1272 = 3 x 1272 + 216

Máximo Divisor Comum (3) mdc (p, q) = p se q =0 mdc (q, p%q) caso contrario - caso base - passo de redução, converge para o caso base p = 8x q = 3x mdc (8x, 3x) mdc (3x, 2x) mdc (2x, x) mdc (x,0) mdc (p, q) = x mdc

Máximo Divisor Comum (4) mdc (p, q) = p se q =0 mdc (q, p%q) caso contrario - caso base - passo de redução, converge para o caso base Implementação em C int mdc (int p, int q) { if (q == 0) return p; //caso base else return mdc(q, p % q); //passo de redução

Memória StackPointer Inicio da Pilha Topo da Memória HeapPointer Início da Área Alocável Variáveis estáticas Código objeto a b 10010101... Constantes constante Sist.Operacional Base da Memória

Programa: StackPointer Inicio da Pilha Topo da Memória int mdc (int p, int q) { if (q == 0) return p; //caso base else return mdc(q, p % q); //passo de redução main () { int n = mdc(6, 4); Variáveis estáticas Código objeto Constantes 10010101... Sist.Operacional Base da Memória

Programa: Topo da Memória n int mdc (int p, int q) { if (q == 0) return p; else return mdc(q, p % q); main () { int n = mdc(6, 4); StackPointer Topo da Pilha Variáveis estáticas Código objeto Constantes &main- #1 p (6) q (4) 10010101... Sist.Operacional Base da Memória

Programa: Topo da Memória n int mdc (int p, int q) { if (q == 0) return p; else return mdc(q, p % q); main () { int n = mdc(6, 4); StackPointer Topo da Pilha Variáveis estáticas Código objeto Constantes &main- #1 p (6) q (4) &mdc- #2 p (4) q (2) 10010101... Sist.Operacional Base da Memória

Programa: Topo da Memória n int mdc (int p, int q) { if (q == 0) return p; else return mdc(q, p % q); main () { int n = mdc(6, 4); StackPointer Topo da Pilha Variáveis estáticas Código objeto Constantes &main- #1 p (6) q (4) &mdc- #2 p (4) q (2) &mdc- #2 p (2) q (0) 10010101... Sist.Operacional Base da Memória

Programa: Topo da Memória n int mdc (int p, int q) { if (q == 0) return p; else return mdc(q, p % q); main () { int n = mdc(6, 4); StackPointer Topo da Pilha Variáveis estáticas Código objeto Constantes &main- #1 p (6) q (4) &mdc- #2 p (4) q (2) &mdc- #2 p (2) q (0) 10010101... Sist.Operacional Base da Memória

Programa: Topo da Memória n int mdc (int p, int q) { if (q == 0) return p; else return mdc(q, p % q); main () { int n = mdc(6, 4); StackPointer Topo da Pilha Variáveis estáticas Código objeto Constantes &main- #1 p (6) q (4) &mdc- #2 p (4) q (2) 10010101... Sist.Operacional Base da Memória

Programa: Topo da Memória n int mdc (int p, int q) { if (q == 0) return p; else return mdc(q, p % q); main () { int n = mdc(6, 4); StackPointer Topo da Pilha vale 2! Variáveis estáticas Código objeto Constantes &main- #1 p (6) q (4) &mdc- #2 p (4) q (2) 10010101... Sist.Operacional Base da Memória

Programa: Topo da Memória n int mdc (int p, int q) { if (q == 0) return p; else return mdc(q, p % q); main () { int n = mdc(6, 4); StackPointer Topo da Pilha Variáveis estáticas Código objeto Constantes &main- #1 p (6) q (4) 10010101... Sist.Operacional Base da Memória

Programa: Topo da Memória n int mdc (int p, int q) { if (q == 0) return p; else return mdc(q, p % q); main () { int n = mdc(6, 4); StackPointer Topo da Pilha vale 2! Variáveis estáticas Código objeto Constantes &main- #1 p (6) q (4) 10010101... Sist.Operacional Base da Memória

Programa: Topo da Memória StackPointer Topo da Pilha n (2) int mdc (int p, int q) { if (q == 0) return p; else return mdc(q, p % q); main () { int n = mdc(6, 4); vale 2! Variáveis estáticas Código objeto Constantes 10010101... Sist.Operacional Base da Memória

Gráficos Recursivos

Árvore H

Árvore H Árvore-H de ordem n Desenha uma letra H Recursivamente desenha 4 árvores-h da ordem de n-1 (e metade do tamanho), cada árvore conectada em um topo (tip). ordem 1 ordem 2 ordem 3

Implementação Recursiva da Árvore H (em C) void draw(int n, double tam, double x, double y) { if (n == 0) return; //condicao de parada double x0 = x - tam/2; double x1 = x + tam/2; double y0 = y - tam/2; double y1 = y + tam/2; DesenhaLinha(x0, y, x1, y); DesenhaLinha(x0, y0, x0, y1); DesenhaLinha(x1, y0, x1, y1); draw(n-1, tam/2, x0, y0); draw(n-1, tam/2, x0, y1); draw(n-1, tam/2, x1, y0); draw(n-1, tam/2, x1, y1); desenha o H centralizado em (x, y) recursivamente desenha 4 Hs com a metade do tamanho

Animação Árvore H

Torres de Hanoi

Objetivo Mover os discos do pino mais a esquerda para o pino da direita Somente um disco por vez pode ser movido; Um disco pode ser colocado num pino vazio ou sobre um disco de tamanho maior; Início Final Torres de Hanoi: animação

Torres de Hanoi: Solução Recursiva

Lenda das Torres de Hanoi Mundo vai acabar quando um grupo de monges conseguirem mover 64 discos de ouro em 3 pinos de diamante. Algoritmos de computação irão ajudar a resolver o problema?

Torres de Hanoi: Implementação Recursiva void moves (int N, int left) { if (N == 0) return; // se não houver discos, retorna moves(n-1,!left); if (left) printf( %d left, N); else printf( %d right, N); moves (N-1,!left);

Torres de Hanoi: Implementação Recursiva (para 3 discos) moves (3, left) moves (2, right) moves (1, left) 1 left 2 right moves (1, left) 1 left 3 left moves (2, right) moves (1, left) 1 left 2 right moves (1, left) 1 left

Torres de Hanoi: árvore de recursão

Torres de Hanoi: Propriedades da solução Leva 2 n 1 moves para resolver o problema com n discos; O algoritmo revela um fato: São necessários 585 milhões de anos para n=64 (considerando que cada movimento de disco leve 1 segundo, os monges não cometam erros e que os monges saibam exatamente para onde movimentar o disco, sem pestanejar) Outro fato: qualquer solução possível para as torres de Hanoi levará no mínimo esse tempo!

Dividir para Conquistar Consiste em dividir o problema em problemas menores Problemas menores são resolvidos recursivamente usando o mesmo método Resultados são combinados para resolver problema original Vários algoritmos são resolvidos com essa técnica (e.x., quicksort, mergesort)

Pontos Negativos da Recursão Considere a sequência de Fibonacci: 0,1,1,2,3,5,8,13,21,34...

Sequência de Fibonacci

Sequência de Fibonacci e a Natureza

Sequência de Fibonacci e a Natureza

Solução Recursiva? long F(int n) { if (n == 0) return 0; if (n == 1) return 1; return F(n-1) + F(n-2); -> Código muito ineficiente! -> Leva muito tempo para computar F(50)!

Problema com Recursão F(50) é chamado uma vez F(49) é chamado uma vez F(48) é chamado 2 vezes F(47) é chamado 3 vezes F(46) é chamado 5 vezes F(45) é chamado 8 vezes Pode facilmente levar a soluções incrivelmente ineficientes!... F(1) é chamado 12,586,269,025 vezes

Resumindo Como escrever programas recursivos simples? Condição de parada, passo da recursão Use desenhos Dividir para conquistar Técnica elegante de resolver problemas (não somente recursivos)

Implementação Recursiva de Listas Considere a lista sem sentinela e sem cabeçalho Definição recursiva: Uma lista é: Uma lista vazia; ou Um elemento seguido de uma (sub)-lista

Implementação Recursiva de Listas Exemplo função imprime Se a lista for vazia, não imprime nada Caso contrário: Imprime o conteúdo da primeira célula (l->item ou l- >Item.campo) Imprime a sub-lista dada por l->prox, chamando a função recursivamente

Implementação Recursiva de Listas /* Função imprime recursiva */ void lst_imprime_rec (TipoLista* l) { if (!lst_vazia(l)) { /* imprime primeiro elemento: lista de inteiros */ printf( Item: %d\n,l->item); /* imprime sub-lista */ lst_imprime_rec(l->prox);

Implementação Recursiva de Listas Exemplo função retira retire o elemento, se ele for o primeiro da lista (ou da sub-lista) caso contrário, chame a função recursivamente para retirar o elemento da sub-lista

Implementação Recursiva de Listas /* Função retira recursiva */ TipoLista* lst_retira_rec (TipoLista* l, int v){ if (!lst_vazia(l)) { /* verifica se elemento a ser retirado é o primeiro */ if (l->item == v) { TipoLista* t = l; /* temporário para liberar */ l = l->prox; free(t); else { /* retira de sub-lista */ l->prox = lst_retira_rec(l->prox,v); return l;

Implementação Recursiva de Listas Exemplo função que testa igualdade entre duas listas int lst_igual (TipoLista* l1, TipoLista* l2) se as duas listas dadas são vazias, são iguais se não forem ambas vazias, mas uma delas é vazia, são diferentes se ambas não forem vazias, teste: se informações associadas aos primeiros nós são iguais se as sub-listas são iguais

Implementação Recursiva de Listas int lst_igual (TipoLista* l1, TipoLista* l2){ if (l1 == NULL && l2 == NULL) return 1; else if (l1 == NULL l2 == NULL) else return 0; return l1->item == l2->item && lst_igual(l1->prox, l2->prox);