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

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

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

Algoritmos e Estruturas de Dados I Linguagem C

Estruturas de Dados. Parte dos slides a seguir são adaptações, extensões e recodificações em C dos originais:

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

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

Programação Estruturada

Introdução à Ciência da Computação. Sumário. Modularização de Algoritmos. Agradecimentos. Modularização de Algoritmos e Funções em C

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

Introdução a Algoritmos Parte 08

Aula prática 5. Funções Recursivas

Análise de Algoritmos Parte 4

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

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

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

Aula 05: - Recursão (parte 1)

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

Aula 05: - Recursão (parte 1)

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

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

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

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

SCC Capítulo 2 Recursão

Programação científica C++

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

Algoritmos e Estruturas de Dados

Recursão. Introdução à Ciência da Computação II(2009/2010) Rosane Minghim. Apoio na confecção: Rogério Eduardo Garcia Danilo Medeiros Eler

Algoritmos e Estruturas de Dados

Recursividade. Recursividade

Técnicas de análise de algoritmos

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

Estrutura de Dados Conceitos Iniciais

Recursividade. Prof. Jesus José de Oliveira Neto

Programação II RECURSÃO

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

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

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

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

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

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

Processamento da Informação

Análise e Complexidade de Algoritmos

Recursividade. Estrutura de Dados. Prof. Kleber Rezende

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

Introdução à Ciência da Computação II

Estruturas de Dados Aula 14: Recursão

SCC0214 Projeto de Algoritmos

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

Algoritmos e Modelação Computacional. Paulo Mateus MEBiom LMAC 2018

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

Revisão: Tipo Abstrato de Dados Recursividade

Divisão e Conquista. Norton T. Roman. Apostila baseada nos trabalhos de Cid de Souza, Cândida da Silva e Delano M. Beder

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

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

Trabalho Prático 1. Valor: 1,0 pontos (10% da nota total) Data de Entrega: 02/05/2010

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

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

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

Roteiro Prático Nº 13 Recursividade

Fundamentos de programação

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.

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

Análise de Complexidade para algoritmos iterativos e recursivos

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA

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

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

LISTA DE EXERCÍCIOS MÊS 04

SCC0601 Projeto de Algoritmos. Recursão

Programa Analítico de Disciplina INF101 Introdução à Programação II

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

Árvores Binárias. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich

Estruturas de Repetição

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

ALGORITMOS I. Procedimentos e Funções

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

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

Projeto e Análise de Algoritmos

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

Melhores momentos AULA 3. Algoritmos p.148/188

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

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

Classes, Herança e Interfaces

UNIVERSIDADE DA BEIRA INTERIOR

1. Faça um programa que leia uma string digitada pelo usuário e salve em um arquivo em branco.

Introdução à Ciência da Computação

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

INF 1007 Programação II

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

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

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

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

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

Algoritmos e Introdução à Programação. Lógica e Linguagem de Programação

Introdução à Ciência da Computação. Sumário. Estruturas de Dados. Agradecimentos. Arranjos: Vetores, Strings & Matrizes em C

Universidade Federal da Grande Dourados Faculdade de Ciências Exatas e Tecnologia Bacharelado em Sistemas de Informação Estruturas de Dados I Lista II

INF 1007 Programação II

BCC202 - Estrutura de Dados I

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

Transcrição:

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

Agradecimentos Parte dos slides a seguir são adaptações dos originais em Pascal gentilmente cedidos pelo Prof. Rudinei Goularte 2

Sumário Recursão Definição e Características Tipos de Recursão Exemplos e Exercícios 3

Recursão Um procedimento ou função é dito recursivo se este invoca (realiza uma chamada) a si mesmo Muitas definições computacionais são (ou podem ser) recursivas. Exemplo: Sistemas Diretório-Arquivo consistem de um diretório cujo conteúdo consiste de arquivos e possivelmente outros diretórios Conceito está intimamente ligado com os conceitos matemáticos de relação de recorrência e indução a n = 2 a n-1, a 0 = 1 a n = 2 n 4

Recursão Exemplo (cálculo do fatorial): Dado um número inteiro x não-negativo, define-se o fatorial de x como: fat(x) = 1 se x = 0 ou x = 1 fat(x) = x * (x 1) * (x 2) *... * 2 * 1 fat(x 1) 5

Recursão Em C, qualquer função pode ser chamada recursivamente Exemplo: cálculo do fatorial long int FAT(long int x) { if (x == 0 x == 1) return 1; else return x*fat(x 1); } OU long int FAT(long int x) { return (x <= 1? 1 : x*fat(x 1) ); } /* Assume argumento x não negativo */

Projeto de Algoritmos por Recursão Exige condição de parada e mudança de estado ou entra em ciclo infinito até estourar a pilha de recursão Quais são elas no código recursivo do fatorial??? Vantagens Muitos problemas são intrinsecamente recursivos Código possivelmente mais claro (simples) Desvantagens Velocidade (chamadas a módulos demandam tempo) Uso adicional de memória (pilha de recursão) Análise teórica possivelmente mais complexa 7

Projeto de Algoritmos por Recursão Exemplo / Exercício: Desenvolva três funções distintas em C para calcular a relação de recorrência a n = 2 a n-1 (a 0 = 1), uma iterativa, uma recursiva e outra analítica (fórmula fechada a n = 2 n ) As funções devem receber um inteiro não negativo n e retornar o termo a n Compare a solução recursiva com as demais sob o ponto de vista das suas possíveis desvantagens, mencionadas anteriormente 8

Traço de Recursão float vetsum(float v[], int n){ if (n == 0) return v[0]; else return ( v[n] + vetsum(v, n 1) ); } retorna 15 + v [ 4 ] = 15 + 5 = 20 vetsum(v,4) retorna 13 + v [ 3 ] = 13 + 2 = 15 vetsum(v,3) Traço de recursão: Exemplo com v = [4 3 6 2 5] vetsum(v,2) vetsum(v,1) vetsum(v,0) retorna 7 + v [ 2 ] = 7 + 6 = 13 retorna 4 + v [ 1 ] = 4 + 3 = 7 retorna v [ 0 ] = 4 9

Tipos de Recursão Alguns Tipos de Recursão: Recursão Linear: Módulo com apenas uma chamada recursiva Recursão Binária: Módulo com duas chamadas recursivas Recursão Múltipla: Módulo com múltiplas chamadas recursivas Recursão Indireta: Módulo A chama B que chama A Recursão de Cauda: Recursão linear cuja chamada recursiva é a última operação do módulo Note que, tecnicamente, a recursão das funções fat e vetsum não são de cauda, mesmo estando na última declaração do módulo: de fato, a última operação é uma multiplicação (fat) ou adição (vetsum) no entanto, é usual chamar esse tipo de recursão como de cauda 10

Recursão Sempre existe versão iterativa de um programa recursivo Conversão nem sempre é trivial Normalmente simples para recursão do tipo cauda Exemplo 1: impressão de vetor void printvet(float v[], int i, int f){ if (i<=f){ printf("%f ", v[i]); printvet(v,i+1,f); /* recursão de cauda */ } } Recursivo Iterativo void printvet(float v[], int i, int f){ int j; } for (j=i; j<=f; j++) printf("%f ", v[j]);

Recursão Exemplo 2: inversão de vetor void invvet(float v[], int i, int f){ float aux; if (i<f){ aux = v[i]; v[i] = v[f]; v[f] = aux; invvet(v,i+1,f 1); } } Exercício: A recursão acima é de cauda? Como é a versão iterativa dessa mesma função? 12

Projeto de Algoritmos por Recursão Situações onde se recomenda usar recursão: Quando o problema é intrinsecamente recursivo e sua solução como tal traz maior clareza E Quando a alternativa recursiva não implica muita ineficiência em termos de tempo de execução e uso de memória (onde muita depende do problema e do usuário) 13

Projeto de Algoritmos por Recursão Situações onde se deve evitar recursão: Quando existe um algoritmo iterativo igualmente claro e simples P. ex. quando a recursão é de cauda P. ex. quando uma única recursão já leva à condição de parada Quando a recursão é ineficiente perante a uma versão iterativa Exemplo: P. ex. quando muitos parâmetros são passados por valor P. ex. quando pode haver sobrecarga da pilha de recursão obtenção do n-ésimo valor da série de Fibonacci... 14

Exercícios Adicionais Qual o efeito final de inverter as linhas 3 e 4 do procedimento recursivo printvet visto anteriormente? Escreva uma função recursiva que receba uma base real e um expoente inteiro e retorne o valor da base elevada ao expoente. É simples provar por indução matemática que a relação de recorrência T n = 2T n 1 + 1 é, para T 0 = 0, equivalente a T n = 2 n 1. Escreva duas funções que recebam um inteiro n e retornem T n, sendo uma recursiva e a outra não. Implemente uma função para calcular o n-ésimo elemento da seqüência de Fibonacci de forma recursiva e classifique a recursão segundo os tipos vistos em aula 15

Bibliografia Ziviani, N. Projeto de Algoritmos. Thomson, 2ª Edição, 2004. A. M. Tenembaum et al., Data Structures Using C, Prentice-Hall, 1990 Schildt, H. "C Completo e Total", 3a. Edição, Pearson, 1997. 16