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

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

Análise de Algoritmos Parte 4

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

Lista de Exercícios sobre Recursividade

Estrutura de Dados Conceitos Iniciais

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

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

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

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

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. Recursão. Prof. Ricardo J. G. B. Campello

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

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

Roteiro Prático Nº 13 Recursividade

Algoritmos e Estruturas de Dados I

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

Aula prática 5. Funções Recursivas

Revisão: Tipo Abstrato de Dados Recursividade

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

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

controle de fluxo repetições iterativas

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

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

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

Exercícios: Recursão

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

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

Recursividade. Recursividade

ANÁLISE DE ALGORITMOS: PARTE 4

Algoritmos de Ordenação

Relações de recorrência

Waldemar Celes e Roberto Ierusalimschy. 29 de Fevereiro de 2012

LISTA DE EXERCÍCIOS MÊS 04

Subprogramas. Prof. Carlos Lopes

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

Analise o código abaixo:

Exercícios Repetição

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA

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

MC102 Algoritmos e Programação de Computadores

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

Processamento da Informação Teoria. Recursividade

Lógica de Programação I

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

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

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

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.

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

Recursividade UFOP 1/48

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

Recursividade, Tentativa e Erro

Paradigmas de Projeto de Algoritmos

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

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

Paradigmas de Projeto de Algoritmos

Busca Binária. Aula 05. Busca em um vetor ordenado. Análise do Busca Binária. Equações com Recorrência

7 a Lista de Exercícios Assunto: Funções e passagem por referência com vetor e matriz (Tópico 7)

Paradigmas de Projeto de Algoritmos

Complexidade de Algoritmos

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

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

Python: Recursão. Claudio Esperança

BCC202 - Estrutura de Dados I

Programação em Linguagem C

Pedro Vasconcelos DCC/FCUP. Programação Funcional 5 a Aula Definições recursivas

SCC Capítulo 6 Paradigmas e Técnicas de Projetos de Algoritmos

Complexidade de Algoritmos

BCC402 Algoritmos e Programação Avançada Prof. Marco Antonio M. Carvalho Prof. Túlio Ângelo M. Toffolo 2011/1

Principais paradigmas de programação. Programação imperativa Programação funcional Programação lógica Programação OO

Computação 2. Diego Addan Aula 3. Funções

Modularização: Funções em C

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

Recursividade e relações de recorrência

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

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

Tentativa e Erro (Backtracking)

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

Funções. Prof. Fabrício Olivetti de França

Compiladores Ambiente de Execução

Python Funções. Introdução à Programação SI1

Uma recorrência é uma equação que descreve uma função em termos do seu valor em entradas menores

Linguagens de Programação Conceitos e Técnicas. Amarrações

Aula 10 Algoritmos e Funções Recursivas

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

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches Juliana de Melo Bezerra

RECURSÃO. 1.1 Definição

AULA 4. Algoritmo de Euclides. Hoje. Algoritmo de Euclides. Correção. Euclides recursivo

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

Paradigmas de Projeto de Algoritmos

5. Funções 5.1 Introdução

Curso Técnico de Mecatrônica 4º Ano 2º Bimestre Introdução à Lógica de Programação

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

ALGORITMOS AVANÇADOS UNIDADE I Análise de Algoritmo - Notação O. Luiz Leão

Programação Funcional Cálculo Lambda - Aula Nº 3

Algoritmos e Funções Recursivas

Simulado de Linguagem de Programação Java

ALGORITMOS E ESTRUTURAS DE DADOS CES-11

Aula 1. Teoria da Computação III

Estruturas de Repetição

Transcrição:

Luiz Leão luizleao@gmail.com http://www.luizleao.com

Conteúdo Programático 2.1 - Definições recursivas 2.2 - Como implementar recursividade 2.3 - Quando não usar recursividade 2.4 - Desenvolvendo algoritmos com recursividade

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

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!

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 Fat (int n) { if (n<=0) return 1; else return n * Fat(n-1); } Main() { int f; f = fat(5); 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 Já 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

Outro exemplo: Série de Fibonacci: F n = F n-1 + F n-2 n > 2, F 0 = F 1 = 1 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89... Fib(int n) { if (n<2) 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 Complexidade: O(n) Conclusão: Não usar recursividade cegamente! 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;

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

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)

Equação de Recorrência Uma recorrência é uma equação que descreve uma função em termos do seu valor em entradas menores

Equação de Recorrência Exemplo Fatorial Número de multiplicações quando n = 1 é zero, logo: T(1) = 0 Número de comparações quando n > 1 é 1 mais o número de multiplicações para n-1, logo: T(n) = 1 + T(n-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 0 r n )/(1-r)

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 0 r n )/(1-r), 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 01 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?

Exercício 01 Resposta int pot(int base, int exp) { if (exp == 0) return 1; else return (base * pot(base, exp-1)); } Análise de complexidade: T(0) = 1; T(b,n) = 1 + T(b,n-1); O(n)

Exercícios 02 Implemente uma função recursiva para computar o valor de 2 n

Exercícios 02 Resposta Pot(int n) { if (n==0) return 1; else return 2 * Pot(n-1); }

Exercício 03 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); }

Exercício 03 Resposta Algoritmo de Euclides. Calcula o MDC (máximo divisor comum) de dois números a e b