Recursividade e análise Cristiano Arbex Valle Vinicius Fernandes dos Santos

Slides:



Advertisements
Apresentações semelhantes
Aquiles Burlamaqui AULA 09
Advertisements

Funções em C Prof. Fabiano Utiyama.
Python: Funções Claudio Esperança.
Python: Recursão Claudio Esperança.
Programação em Java Prof. Maurício Braga
Marco Antonio Montebello Júnior
Recursividade Prof. Rosana Palazon.
Recursividade Prof. Alex F. V. Machado
Árvores.
1 MergeSort Seja uma lista A de n elementos. O algoritmo consiste das seguintes fases Dividir A em 2 sub-listas de tamanho n/2 Conquistar: ordenar cada.
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
Medida do Tempo de Execução de um Programa
Busca Cega (Exaustiva)
Recursividade Conceitos e Aplicações.
Árvores Introdução e Aplicações Árvores de Busca Binária Fundamentos
SISTEMAS LINEARES I Prof. Marlon.
Dividir-e-Conquistar
Capítulo 3 - Russell e Norvig
Recorrências.
Curso de Programação em C++
Linguagem C Funções.
Programação Dinámica Análise de algoritmos UNISUL
APRESENTAÇÃO: DAVID ANDERSON CARDOSO DANTAS CURSO DE C AULA 04: Funções Maceió, Maio de 2010.
Introdução à Programação
Prof. Natalia Castro Fernandes Mestrado em Telecomunicações – UFF 2º semestre/2012.
Prof. Natalia Castro Fernandes Mestrado em Telecomunicações – UFF 2º semestre/2012.
Algoritmos Recursivos Klauko Mota. Conceito de Recursividade Um programa recursivo é um programa que chama a si mesmo, direta ou indiretamente Conceito.
Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação
UNIDADE 6 - complemento Funções recursivas
Aula T06 – BCC202 Análise de Algoritmos (Parte 4) Túlio Toffolo
PROGRAMAÇÃO ESTRUTURADA (MODULARIZAÇÃO/SUBPROGRAMAÇÃO)
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Recursão.
Introdução e Busca Cega
Introdução aos Agentes Inteligentes Busca Cega (Exaustiva)
Linguagem Funcional 2 Linguagem Funcional 2 - LF2 Estende LF1 com funções de alta ordem Uma função passa a ser um valor O contexto inclui um único componente:
Mergesort Katia Guimarães.
Paradigmas de Projetos de Algoritmos
Algoritmos e Estruturas de Dados I – Recursão
Recursão Uma função é dita recursiva quando dentro do seu código existe uma chamada para si mesma Exemplo Cálculo do fatorial de um número:
Universidade do Vale do Rio dos Sinos - São Leopoldo -
Capítulo VIII Ambientes de Execução
Algoritmos - Profa. Alciléia1 Profa. Maria Alciléia Alves Rocha Funções em C 2011.
Algoritmos e Estruturas de Dados RECURSIVIDADE. O que é recursividade? Recursividade significa algo ser definido em termos de sí próprio. Em termos de.
Estruturas de Dados Aula 15: Árvores
Aula prática 3 Aprofundando em Funções Parâmetros de uma função Uso do return Execução Variáveis Global, local e estática Monitoria de Introdução à.
Recursividade Bruno Silva.
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2014 Capítulo IX Subprogramação e Recursividade.
Recursividade Profs. De Prog2 e Lab2.
Alinhamento de Cadeias de DNA COMPARAÇÃO DE SEQÜÊNCIAS
Complexidade de Computação Katia Guimarães. Avaliando a Qualidade de um Algoritmo É preciso ter bem definido –O que é dado de entrada e –O que é esperado.
Algoritmos e Programação MC102
Analise de Algoritmos e Notação Assintótica
Ciência da Computação 1 PROGRAMAÇÃO ESTRUTURADA II Profª. Noeli.
Recursividade Aula I – ALG II CPAN – UFMS. Recursividade A recursão é uma técnica pela qual uma rotina estruturada faz chamadas a ela mesma, com o objetivo.
Algoritmo e Estrutura de Dados I
Professor Luiz José Hoffmann Filho
PCI- Funções e Procedimentos Profa. Mercedes Gonzales Márquez.
Algoritmos e Programação MC102 Prof. Paulo Miranda IC-UNICAMP Aula 15 Funções.
CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo VIII Subprogramação.
Módulo I Capítulo 7: Funções e Procedimentos William Ivanski Curso de Programação C#
Sistemas Inteligentes Busca Cega (Exaustiva)
Aula Prática 5 Recursão Monitoria  Na linguagem C, como em muitas outras linguagens, uma função pode chamar a si própria.  Uma função assim.
Computação Científica e Equações Diferenciais Geovan Tavares e Hélio Lopes PUC-Rio – Departamento de Matemática Laboratório Matmidia
Técnicas de Análise de Algoritmos Cristiano Arbex Valle Vinicius Fernandes dos Santos
UNIVERSIDADE FEDERAL DE MINAS GERAIS Exercícios de Revisão 1 Crisitano Arbex Valle Vinicius Fernandes dos Santos
Comportamento Assintótico
UNIVERSIDADE FEDERAL DE MINAS GERAIS Árvores Cristiano Arbex Valle Vinicius Fernandes dos Santos
Curso de Introdução à Lógica Computacional
Transcrição da apresentação:

Recursividade e análise Cristiano Arbex Valle Vinicius Fernandes dos Santos

Algoritmos e Estrutura de Dados II Recursividade Um procedimento que chama a si mesmo é dito ser recursivo. Recursividade permite descrever algoritmos de forma mais clara e concisa, especialmente problemas recursivos por natureza ou que utilizam estruturas recursivas. Exemplos  Algoritmos de “Dividir para Conquistar”  Árvores

Algoritmos e Estrutura de Dados II Exemplo Fatorial: n! = n*(n-1)! para todo n>0 0! = 1 Em C int Fat (int n) { if (n <= 0) return 1; else return n * Fat(n-1); }

Algoritmos e Estrutura de Dados II Estrutura Normalmente, as funções recursivas são divididas em duas partes  Chamada Recursiva  Condição de Parada A chamada recursiva pode ser Direta: função A chama ela mesma Indireta: A chama B que chama A novamente A condição de parada é fundamental para evitar loops infinitos

Algoritmos e Estrutura de Dados II 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 “ponto de retorno” no programa ou subprograma que chamou essa função Ao final da execução da função: O registro é desempilhado A execução volta ao subprograma que chamou a função

Algoritmos e Estrutura de Dados II Execução pilha de execução topo da pilha registro de ativação

Algoritmos e Estrutura de Dados II int Fat(int n) { if (n <= 0) return 1; else return n * Fat(n-1); } main() { int f; f = fat(4); printf(“%d”,f); } pilha de execução fat(4) fat(3) fat(2) fat(1) fat(0) Exemplo

Algoritmos e Estrutura de Dados II 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 à pilha de execução Já no fatorial não recursivo a complexidade de espaço é O(1) int Fat(int n) { int f; f = 1; while(n > 0) { f = f * n; n = n – 1; } return f; }

Algoritmos e Estrutura de Dados II Recursividade Portanto, a recursividade nem sempre é a melhor solução, mesmo quando a definição matemática do problema é feita em termos recursivos.

Algoritmos e Estrutura de Dados II Fibonacci Outro exemplo: Série de Fibonacci:  1, 1, 2, 3, 5, 8, 13, 21, 34, 55,  F 1 = F 2 = 1  F(n) = F(n-1) + F(n-2) n > 2 Phi = 1, (Proporção áurea)

Algoritmos e Estrutura de Dados II Fibonacci Outro exemplo: Série de Fibonacci:  1, 1, 2, 3, 5, 8, 13, 21, 34, 55,  F 1 = F 2 = 1  F(n) = F(n-1) + F(n-2) n > 2

Algoritmos e Estrutura de Dados II Fibonacci Outros exemplos na natureza:

Algoritmos e Estrutura de Dados II Fibonacci Série de Fibonacci:  F 1 = F 2 = 1  F(n) = F(n-1)+ F(n-2) n > 2 int Fib(int n) { if (n < 3) return 1; else return Fib(n-1) + Fib(n-2); }

Algoritmos e Estrutura de Dados II Análise da função Fibonacci Ineficiência em Fibonacci  Termos F(n-1) e F(n-2) são computados independentemente  Custo para cálculo de F(n)  O(  n ) onde  = (1 +  5)/2 = 1,  Exponencial

Algoritmos e Estrutura de Dados II Fibonacci não recursivo Complexidade: O(n) Conclusão: não usar recursividade cegamente! int FibIter(int n) { int fn1 = 1, fn2 = 1; int fn, i; if (n < 3) return 1; for (i = 3; i <= n; i++) { fn = fn2 + fn1; fn2 = fn1; fn1 = fn; } return fn; }

Algoritmos e Estrutura de Dados II Quando vale a pena usar recursividade Algoritmos complexos, cuja implementação iterativa é complexa e normalmente requer o uso explícito de uma pilha  Dividir para Conquistar (Ex. Quicksort)  Divide and Conquer  Caminhamento em Árvores (pesquisa)

Algoritmos e Estrutura de Dados II 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

Algoritmos e Estrutura de Dados II Exemplo: régua void regua(int l, r, h) { int m; if (h > 0) { m = (l + r) / 2; marca(m, h); regua(l, m, h – 1); regua(m, r, h – 1); }

Algoritmos e Estrutura de Dados II 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)

Algoritmos e Estrutura de Dados II Representação por árvore 0, 8, 3 0, 4, 2 4, 8, 2 0, 2, 12, 4, 14, 6, 1 6, 8, 1 0, 1, 0 1, 2, 02, 3, 0 3, 4, 0 4, 5, 0 5, 6, 0 6, 7, 0 7, 8, 0

Organizam dados de forma hierárquica Acontecem com frequência na natureza Fáceis de representar e manipular com computadores Úteis para várias tarefas Árvores

Exemplos

Terminologia

Raiz Terminologia Raiz

Folhas Terminologia Folhas

Nós internos Terminologia Nós internos

Filhos Pai Terminologia

Descendentes Terminologia

Ancestrais Terminologia

Irmãos Terminologia

Níveis Terminologia

Caminho Terminologia

Algoritmos e Estrutura de Dados II Análise de Algoritmos Recursivos Para cada procedimento recursivo é associada uma função de complexidade f(n) desconhecida, onde n mede o tamanho dos argumentos para o procedimento. Por se tratar de um algoritmo recursivo, f(n) vai ser obtida através de uma equação de recorrência. Equação de recorrência: maneira de definir uma função por uma expressão envolvendo a mesma função. Análise de complexidade

Algoritmos e Estrutura de Dados II Análise de Algoritmos Recursivos Custo de um algoritmo recursivo: T(n) Custo de cada subproblema: T(n / b) Número de chamadas recursivas: a Custo de cada chamada: f(n) Capturado pela equação de recorrência: Análise de complexidade

Algoritmos e Estrutura de Dados II Resolvendo a Equação de Recorrência Existem várias formas de se resolver uma equação de recorrência. A mais simples é expandir a equação e depois fazer uma substituição dos termos. Análise de complexidade

Algoritmos e Estrutura de Dados II Exemplo 1 Determine a equação de recorrência para a função abaixo. Qual a sua complexidade? int Fat(int n) { if (n <= 0) return 1; else return n * Fat(n-1); } Análise de complexidade

Exemplo 1 Algoritmos e Estrutura de Dados II Análise de complexidade

Algoritmos e Estrutura de Dados II Exemplo 2 Determine a equação de recorrência para a função abaixo. Qual a sua complexidade? void ex(int *X, int n){ int i; if (n > 0) { for (i=0; i<n-1; i++) X[i] = 0; X[n] = n; ex(X, n-1); } } Análise de complexidade

Exemplo 2 Algoritmos e Estrutura de Dados II Análise de complexidade

Algoritmos e Estrutura de Dados II Exemplo 3 Determine a equação de recorrência para a função abaixo (considere ( A[] global). Qual a sua complexidade? void Pesquisa(n) { if (n <= 1) { verifica(A[0]); } else { for (int i = 0; i < n; i++) { verifica(A[i]); } Pesquisa(n/3); } Análise de complexidade

Algoritmos e Estrutura de Dados II Análise da Função Recursiva Suposições: A função verifica() é O(1) n é sempre divisível por 3 Qual a equação de recorrência? T(n) = n + T(n/3) T(1) = 1 Análise de complexidade

Algoritmos e Estrutura de Dados II Resolvendo a equação Substitui-se os termos T(k), k 1, tenham sido substituídos por fórmulas contendo apenas T(1). Análise de complexidade 1 → n/3 K = 1 → n = 3 K

Algoritmos e Estrutura de Dados II Resolvendo a Equação Considerando que T(n/3 K ) = T(1) temos: Temos uma PG finita: O(n) Análise de complexidade

Exemplo 3 Algoritmos e Estrutura de Dados II Análise de complexidade Resolva a relação de recorrência: T(n) = T(n/2) + c (c é uma constante) T(1) = 1 Expandindo:

Exemplo 3 Algoritmos e Estrutura de Dados II Análise de complexidade Resolva a relação de recorrência: n/2 k = 1  n = 2 k