SlideShare uma empresa Scribd logo
1 de 29
Aula 6 - Recursividade
David Menotti
Algoritmos e Estruturas de Dados I
DECOM – UFOP
Algoritmos e Estrutura
de Dados I© David Menotti
Conceito de 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
Renato Ferreira
Algoritmos e Estrutura
de Dados I© David Menotti
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)!
Algoritmos e Estrutura
de Dados I© David Menotti
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
Algoritmos e Estrutura
de Dados I© David Menotti
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!
Renato Ferreira
Algoritmos e Estrutura
de Dados I© David Menotti
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.
Algoritmos e Estrutura
de Dados I© David Menotti
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
Algoritmos e Estrutura
de Dados I© David Menotti
Exemplo
Fat (int n) {
if (n<=0)
return 1;
else
return n * Fat(n-1);
}
Main() {
int f;
f = fat(5);
printf(“%d”,f);
}
Algoritmos e Estrutura
de Dados I© David Menotti
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
 Ja 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;
}
Algoritmos e Estrutura
de Dados I© David Menotti
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 I© David Menotti
Fibonacci
 Outro exemplo: Série de Fibonacci:
 Fn = Fn-1 + Fn-2 n > 2,
 F0 = F1 = 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);
}
Algoritmos e Estrutura
de Dados I© David Menotti
Análise da função Fibonacci
 Ineficiência em Fibonacci
 Termos Fn-1 e Fn-2 são computados
independentemente
 Número de chamadas recursivas = número de
Fibonacci!
 Custo para cálculo de Fn
 O(φn
) onde φ = (1 + √5)/2 = 1,61803...
 Golden ratio
 Exponencial!!!
Algoritmos e Estrutura
de Dados I© David Menotti
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;
}
Algoritmos e Estrutura
de Dados I© David Menotti
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)
Algoritmos e Estrutura
de Dados I© David Menotti
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 I© David Menotti
Outros exemplos de recursividade
void estrela(int x,int y, int r)
{
if ( r > 0 )
{
estrela(x-r, y+r, r div 2);
estrela(x+r, y+r, r div 2);
estrela(x-r, y-r, r div 2);
estrela(x+r, y-r, r div 2);
box(x, y, r);
}
}
Algoritmos e Estrutura
de Dados I© David Menotti
Exemplo simples: régua
int regua(int l,int r,int 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 I© David Menotti
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 I© David Menotti
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):
 Especifica-se T(n) como uma função dos termos
anteriores
 Especifica-se a condição de parada (e.g. T(1))
Algoritmos e Estrutura
de Dados I© David Menotti
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)
Algoritmos e Estrutura
de Dados I© David Menotti
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)?
Algoritmos e Estrutura
de Dados I© David Menotti
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) ;
}
}
Algoritmos e Estrutura
de Dados I© David Menotti
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: (a0 – rn
)/(1-r)
Algoritmos e Estrutura
de Dados I© David Menotti
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/3K
= 1 → n = 3K
1
Algoritmos e Estrutura
de Dados I© David Menotti
Resolvendo a Equação
Considerando que T(n/3K
) = T(1) temos:
T(n) = Σ (n/3i
) + T(1) = n Σ (1/3i
) + 1
Aplicando a fórmula do somatório de uma PG finita
(a0 – rn
)/(1-r), temos:
n (1 – (1/3)K
)/(1 -1/3) + 1
n (1 – (1/3K
))/(1 -1/3) + 1
n (1 – (1/n))/(1 -1/3) + 1
(n – 1)/(2/3) + 1
3n/2 – ½
i=0
K-1
i=0
K-1
O(n)
Algoritmos e Estrutura
de Dados I© David Menotti
Exercício
 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?
Algoritmos e Estrutura
de Dados I© David Menotti
Função de Potência Recursiva
int pot(int base, int exp)
{
if (!exp)
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)
Algoritmos e Estrutura
de Dados I© David Menotti
Exercícios
 Implemente uma função recursiva para
computar o valor de 2n
 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);
}
Algoritmos e Estrutura
de Dados I© David Menotti
Respostas

 Algoritmo de Euclides. Calcula o MDC
(máximo divisor comum) de dois números
a e b
Pot(int n) {
if (n==0)
return 1;
else
return 2 * Pot(n-1);
}

Mais conteúdo relacionado

Mais procurados

Conceitos Iniciais de Linguagens de Programação
Conceitos Iniciais de Linguagens de ProgramaçãoConceitos Iniciais de Linguagens de Programação
Conceitos Iniciais de Linguagens de ProgramaçãoSidney Roberto
 
Lógica de programação { para iniciantes }
Lógica de programação { para iniciantes }Lógica de programação { para iniciantes }
Lógica de programação { para iniciantes }Mariana Camargo
 
Análise de Algoritmos - Análise Assintótica
Análise de Algoritmos - Análise AssintóticaAnálise de Algoritmos - Análise Assintótica
Análise de Algoritmos - Análise AssintóticaDelacyr Ferreira
 
Estrutura de Dados - Aula 01
Estrutura de Dados - Aula 01Estrutura de Dados - Aula 01
Estrutura de Dados - Aula 01thomasdacosta
 
Estrutura de Dados Aula 07 - Alocação dinâmica de memória
Estrutura de Dados Aula 07 - Alocação dinâmica de memóriaEstrutura de Dados Aula 07 - Alocação dinâmica de memória
Estrutura de Dados Aula 07 - Alocação dinâmica de memóriaLeinylson Fontinele
 
Gestão da informação na AP - Luis Vidigal - Sociedade da Informação
Gestão da informação na AP - Luis Vidigal - Sociedade da InformaçãoGestão da informação na AP - Luis Vidigal - Sociedade da Informação
Gestão da informação na AP - Luis Vidigal - Sociedade da InformaçãoLuis Vidigal
 
Introdução à Informática - Módulo 2 - Conceitos Básicos
Introdução à Informática - Módulo 2 - Conceitos BásicosIntrodução à Informática - Módulo 2 - Conceitos Básicos
Introdução à Informática - Módulo 2 - Conceitos BásicosMinistério Público da Paraíba
 
Unidade 1.4. os dispositivos de entrada e saida mais comuns
Unidade 1.4.   os dispositivos de entrada e saida mais comunsUnidade 1.4.   os dispositivos de entrada e saida mais comuns
Unidade 1.4. os dispositivos de entrada e saida mais comunshenriquecorreiosapo
 
Informática e suas tecnologias
Informática e suas tecnologiasInformática e suas tecnologias
Informática e suas tecnologiasAndrey Martins
 
Resumo básico de introdução à informática
Resumo básico de introdução à informáticaResumo básico de introdução à informática
Resumo básico de introdução à informáticaDaiana de Ávila
 
Sistemas Computacionais - Aula 02 - Definição de SI - Composição
Sistemas Computacionais - Aula 02 - Definição de SI - ComposiçãoSistemas Computacionais - Aula 02 - Definição de SI - Composição
Sistemas Computacionais - Aula 02 - Definição de SI - ComposiçãoLeinylson Fontinele
 
Ciência de Dados: a revolução na tomada de decisões
Ciência de Dados: a revolução na tomada de decisõesCiência de Dados: a revolução na tomada de decisões
Ciência de Dados: a revolução na tomada de decisõesMarlesson Santana
 
Aulas 1 e 2 - Hardware
Aulas 1 e 2 - HardwareAulas 1 e 2 - Hardware
Aulas 1 e 2 - HardwareJocelma Rios
 

Mais procurados (20)

Conceitos Iniciais de Linguagens de Programação
Conceitos Iniciais de Linguagens de ProgramaçãoConceitos Iniciais de Linguagens de Programação
Conceitos Iniciais de Linguagens de Programação
 
Dados x informação
Dados x informaçãoDados x informação
Dados x informação
 
Algoritmos - capítulo 1
Algoritmos - capítulo 1Algoritmos - capítulo 1
Algoritmos - capítulo 1
 
Lógica de programação { para iniciantes }
Lógica de programação { para iniciantes }Lógica de programação { para iniciantes }
Lógica de programação { para iniciantes }
 
Análise de Algoritmos - Análise Assintótica
Análise de Algoritmos - Análise AssintóticaAnálise de Algoritmos - Análise Assintótica
Análise de Algoritmos - Análise Assintótica
 
Estrutura de Dados - Aula 01
Estrutura de Dados - Aula 01Estrutura de Dados - Aula 01
Estrutura de Dados - Aula 01
 
Algoritmos
AlgoritmosAlgoritmos
Algoritmos
 
Estrutura de Dados Aula 07 - Alocação dinâmica de memória
Estrutura de Dados Aula 07 - Alocação dinâmica de memóriaEstrutura de Dados Aula 07 - Alocação dinâmica de memória
Estrutura de Dados Aula 07 - Alocação dinâmica de memória
 
Gestão da informação na AP - Luis Vidigal - Sociedade da Informação
Gestão da informação na AP - Luis Vidigal - Sociedade da InformaçãoGestão da informação na AP - Luis Vidigal - Sociedade da Informação
Gestão da informação na AP - Luis Vidigal - Sociedade da Informação
 
Algoritmo aula 01-f
Algoritmo   aula 01-fAlgoritmo   aula 01-f
Algoritmo aula 01-f
 
Aula de hardware
Aula de hardwareAula de hardware
Aula de hardware
 
Introdução à Informática - Módulo 2 - Conceitos Básicos
Introdução à Informática - Módulo 2 - Conceitos BásicosIntrodução à Informática - Módulo 2 - Conceitos Básicos
Introdução à Informática - Módulo 2 - Conceitos Básicos
 
Unidade 1.4. os dispositivos de entrada e saida mais comuns
Unidade 1.4.   os dispositivos de entrada e saida mais comunsUnidade 1.4.   os dispositivos de entrada e saida mais comuns
Unidade 1.4. os dispositivos de entrada e saida mais comuns
 
Lógica de Programação
Lógica de ProgramaçãoLógica de Programação
Lógica de Programação
 
Introducao a informatica
Introducao a informaticaIntroducao a informatica
Introducao a informatica
 
Informática e suas tecnologias
Informática e suas tecnologiasInformática e suas tecnologias
Informática e suas tecnologias
 
Resumo básico de introdução à informática
Resumo básico de introdução à informáticaResumo básico de introdução à informática
Resumo básico de introdução à informática
 
Sistemas Computacionais - Aula 02 - Definição de SI - Composição
Sistemas Computacionais - Aula 02 - Definição de SI - ComposiçãoSistemas Computacionais - Aula 02 - Definição de SI - Composição
Sistemas Computacionais - Aula 02 - Definição de SI - Composição
 
Ciência de Dados: a revolução na tomada de decisões
Ciência de Dados: a revolução na tomada de decisõesCiência de Dados: a revolução na tomada de decisões
Ciência de Dados: a revolução na tomada de decisões
 
Aulas 1 e 2 - Hardware
Aulas 1 e 2 - HardwareAulas 1 e 2 - Hardware
Aulas 1 e 2 - Hardware
 

Destaque

Logica Algoritmo 08 Recursividade
Logica Algoritmo 08 RecursividadeLogica Algoritmo 08 Recursividade
Logica Algoritmo 08 RecursividadeRegis Magalhães
 
Análise de Algoritmos - Recursividade
Análise de Algoritmos - RecursividadeAnálise de Algoritmos - Recursividade
Análise de Algoritmos - RecursividadeDelacyr Ferreira
 
Recursividade em linguagem C
Recursividade em linguagem CRecursividade em linguagem C
Recursividade em linguagem CLeonardo Lima
 
Conferencia consenso Bronquiolitis aguda_resumen recomendaciones
Conferencia consenso Bronquiolitis aguda_resumen recomendacionesConferencia consenso Bronquiolitis aguda_resumen recomendaciones
Conferencia consenso Bronquiolitis aguda_resumen recomendacionesJavier González de Dios
 
Algoritmos e Estrutura de Dados - Aula 02
Algoritmos e Estrutura de Dados - Aula 02Algoritmos e Estrutura de Dados - Aula 02
Algoritmos e Estrutura de Dados - Aula 02thomasdacosta
 
Apresentando Virtualização de computadores (vmware)
Apresentando Virtualização de computadores (vmware)Apresentando Virtualização de computadores (vmware)
Apresentando Virtualização de computadores (vmware)PEDRO DELFINO
 
Algoritmos e Estrutura de Dados - Aula 04
Algoritmos e Estrutura de Dados - Aula 04Algoritmos e Estrutura de Dados - Aula 04
Algoritmos e Estrutura de Dados - Aula 04thomasdacosta
 
Palestra sobre Certificações Profissionais - IFRN
Palestra sobre Certificações Profissionais - IFRNPalestra sobre Certificações Profissionais - IFRN
Palestra sobre Certificações Profissionais - IFRNIvanildo Teixeira Galvão
 

Destaque (12)

Logica Algoritmo 08 Recursividade
Logica Algoritmo 08 RecursividadeLogica Algoritmo 08 Recursividade
Logica Algoritmo 08 Recursividade
 
Recursividade
RecursividadeRecursividade
Recursividade
 
Análise de Algoritmos - Recursividade
Análise de Algoritmos - RecursividadeAnálise de Algoritmos - Recursividade
Análise de Algoritmos - Recursividade
 
Recursividade
RecursividadeRecursividade
Recursividade
 
Recursividade em linguagem C
Recursividade em linguagem CRecursividade em linguagem C
Recursividade em linguagem C
 
Estrutura de dados em Java - Recursividade
Estrutura de dados em Java - RecursividadeEstrutura de dados em Java - Recursividade
Estrutura de dados em Java - Recursividade
 
Recursividade
RecursividadeRecursividade
Recursividade
 
Conferencia consenso Bronquiolitis aguda_resumen recomendaciones
Conferencia consenso Bronquiolitis aguda_resumen recomendacionesConferencia consenso Bronquiolitis aguda_resumen recomendaciones
Conferencia consenso Bronquiolitis aguda_resumen recomendaciones
 
Algoritmos e Estrutura de Dados - Aula 02
Algoritmos e Estrutura de Dados - Aula 02Algoritmos e Estrutura de Dados - Aula 02
Algoritmos e Estrutura de Dados - Aula 02
 
Apresentando Virtualização de computadores (vmware)
Apresentando Virtualização de computadores (vmware)Apresentando Virtualização de computadores (vmware)
Apresentando Virtualização de computadores (vmware)
 
Algoritmos e Estrutura de Dados - Aula 04
Algoritmos e Estrutura de Dados - Aula 04Algoritmos e Estrutura de Dados - Aula 04
Algoritmos e Estrutura de Dados - Aula 04
 
Palestra sobre Certificações Profissionais - IFRN
Palestra sobre Certificações Profissionais - IFRNPalestra sobre Certificações Profissionais - IFRN
Palestra sobre Certificações Profissionais - IFRN
 

Semelhante a Aula 6 - Recursividade: Conceitos e Exemplos

13 introducao a analise de algoritmos
13   introducao a analise de algoritmos13   introducao a analise de algoritmos
13 introducao a analise de algoritmosRicardo Bolanho
 
Algoritmo de programação dinâmica-01.pdf
Algoritmo de programação dinâmica-01.pdfAlgoritmo de programação dinâmica-01.pdf
Algoritmo de programação dinâmica-01.pdfCaiqueMiranda7
 
Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...
Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...
Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...Universidade de São Paulo
 
Aula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.pptAula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.pptssuserd654cb1
 
Aula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).pptAula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).pptssuserd654cb1
 
EDA_Aula_09_Complexidade_2021.1.pdf
EDA_Aula_09_Complexidade_2021.1.pdfEDA_Aula_09_Complexidade_2021.1.pdf
EDA_Aula_09_Complexidade_2021.1.pdfSimoneSantos16595
 
Artigo sobre complexibilidade complexity.pdf
Artigo sobre complexibilidade complexity.pdfArtigo sobre complexibilidade complexity.pdf
Artigo sobre complexibilidade complexity.pdfItaloRainier1
 
12 algoritmos e funcoes recursivas
12   algoritmos e funcoes recursivas12   algoritmos e funcoes recursivas
12 algoritmos e funcoes recursivasRicardo Bolanho
 
Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04thomasdacosta
 
19 algoritmos de enumeracao
19   algoritmos de enumeracao19   algoritmos de enumeracao
19 algoritmos de enumeracaoRicardo Bolanho
 
4 introdução ao paradigma funcional
4 introdução ao paradigma funcional4 introdução ao paradigma funcional
4 introdução ao paradigma funcionalPéricles Miranda
 
Introdução Programação Em Maple
Introdução Programação Em MapleIntrodução Programação Em Maple
Introdução Programação Em Maplejeandson correa
 
Estrutura de dados
Estrutura de dadosEstrutura de dados
Estrutura de dadosgjpbg
 
Apostila estrutura de dados 2
Apostila estrutura de dados 2Apostila estrutura de dados 2
Apostila estrutura de dados 2Leandro Lopes
 
Desenvolvimento análise de sistemas lineares
Desenvolvimento análise de sistemas linearesDesenvolvimento análise de sistemas lineares
Desenvolvimento análise de sistemas linearesMaique Mateus
 
Algoritmo e estruturas de dados operações com matrizes
Algoritmo e estruturas de dados operações com matrizesAlgoritmo e estruturas de dados operações com matrizes
Algoritmo e estruturas de dados operações com matrizesRADILSON RIPARDO DE FRETIAS
 
Aprendizagem Supervisionada I
Aprendizagem Supervisionada IAprendizagem Supervisionada I
Aprendizagem Supervisionada ILuís Nunes
 

Semelhante a Aula 6 - Recursividade: Conceitos e Exemplos (20)

13 introducao a analise de algoritmos
13   introducao a analise de algoritmos13   introducao a analise de algoritmos
13 introducao a analise de algoritmos
 
Algoritmo de programação dinâmica-01.pdf
Algoritmo de programação dinâmica-01.pdfAlgoritmo de programação dinâmica-01.pdf
Algoritmo de programação dinâmica-01.pdf
 
Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...
Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...
Complexidade de Algoritmos, Notação assintótica, Algoritmos polinomiais e in...
 
Aula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.pptAula_07_Complexidade_de_Algoritmos.ppt
Aula_07_Complexidade_de_Algoritmos.ppt
 
Aula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).pptAula_07_Complexidade_de_Algoritmos (1).ppt
Aula_07_Complexidade_de_Algoritmos (1).ppt
 
EDA_Aula_09_Complexidade_2021.1.pdf
EDA_Aula_09_Complexidade_2021.1.pdfEDA_Aula_09_Complexidade_2021.1.pdf
EDA_Aula_09_Complexidade_2021.1.pdf
 
Ed1
Ed1Ed1
Ed1
 
Apostila rpira
Apostila rpiraApostila rpira
Apostila rpira
 
Artigo sobre complexibilidade complexity.pdf
Artigo sobre complexibilidade complexity.pdfArtigo sobre complexibilidade complexity.pdf
Artigo sobre complexibilidade complexity.pdf
 
Aula 1 a 15 vol1
Aula 1 a 15 vol1Aula 1 a 15 vol1
Aula 1 a 15 vol1
 
12 algoritmos e funcoes recursivas
12   algoritmos e funcoes recursivas12   algoritmos e funcoes recursivas
12 algoritmos e funcoes recursivas
 
Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04Estrutura de Dados - Aula 04
Estrutura de Dados - Aula 04
 
19 algoritmos de enumeracao
19   algoritmos de enumeracao19   algoritmos de enumeracao
19 algoritmos de enumeracao
 
4 introdução ao paradigma funcional
4 introdução ao paradigma funcional4 introdução ao paradigma funcional
4 introdução ao paradigma funcional
 
Introdução Programação Em Maple
Introdução Programação Em MapleIntrodução Programação Em Maple
Introdução Programação Em Maple
 
Estrutura de dados
Estrutura de dadosEstrutura de dados
Estrutura de dados
 
Apostila estrutura de dados 2
Apostila estrutura de dados 2Apostila estrutura de dados 2
Apostila estrutura de dados 2
 
Desenvolvimento análise de sistemas lineares
Desenvolvimento análise de sistemas linearesDesenvolvimento análise de sistemas lineares
Desenvolvimento análise de sistemas lineares
 
Algoritmo e estruturas de dados operações com matrizes
Algoritmo e estruturas de dados operações com matrizesAlgoritmo e estruturas de dados operações com matrizes
Algoritmo e estruturas de dados operações com matrizes
 
Aprendizagem Supervisionada I
Aprendizagem Supervisionada IAprendizagem Supervisionada I
Aprendizagem Supervisionada I
 

Aula 6 - Recursividade: Conceitos e Exemplos

  • 1. Aula 6 - Recursividade David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
  • 2. Algoritmos e Estrutura de Dados I© David Menotti Conceito de 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 Renato Ferreira
  • 3. Algoritmos e Estrutura de Dados I© David Menotti 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)!
  • 4. Algoritmos e Estrutura de Dados I© David Menotti 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
  • 5. Algoritmos e Estrutura de Dados I© David Menotti 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! Renato Ferreira
  • 6. Algoritmos e Estrutura de Dados I© David Menotti 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.
  • 7. Algoritmos e Estrutura de Dados I© David Menotti 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
  • 8. Algoritmos e Estrutura de Dados I© David Menotti Exemplo Fat (int n) { if (n<=0) return 1; else return n * Fat(n-1); } Main() { int f; f = fat(5); printf(“%d”,f); }
  • 9. Algoritmos e Estrutura de Dados I© David Menotti 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  Ja 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; }
  • 10. Algoritmos e Estrutura de Dados I© David Menotti Recursividade  Portanto, a recursividade nem sempre é a melhor solução, mesmo quando a definição matemática do problema é feita em termos recursivos
  • 11. Algoritmos e Estrutura de Dados I© David Menotti Fibonacci  Outro exemplo: Série de Fibonacci:  Fn = Fn-1 + Fn-2 n > 2,  F0 = F1 = 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); }
  • 12. Algoritmos e Estrutura de Dados I© David Menotti Análise da função Fibonacci  Ineficiência em Fibonacci  Termos Fn-1 e Fn-2 são computados independentemente  Número de chamadas recursivas = número de Fibonacci!  Custo para cálculo de Fn  O(φn ) onde φ = (1 + √5)/2 = 1,61803...  Golden ratio  Exponencial!!!
  • 13. Algoritmos e Estrutura de Dados I© David Menotti 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; }
  • 14. Algoritmos e Estrutura de Dados I© David Menotti 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)
  • 15. Algoritmos e Estrutura de Dados I© David Menotti 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
  • 16. Algoritmos e Estrutura de Dados I© David Menotti Outros exemplos de recursividade void estrela(int x,int y, int r) { if ( r > 0 ) { estrela(x-r, y+r, r div 2); estrela(x+r, y+r, r div 2); estrela(x-r, y-r, r div 2); estrela(x+r, y-r, r div 2); box(x, y, r); } }
  • 17. Algoritmos e Estrutura de Dados I© David Menotti Exemplo simples: régua int regua(int l,int r,int h) { int m; if ( h > 0 ) { m = (l + r) / 2; marca(m, h); regua(l, m, h – 1); regua(m, r, h – 1); } }
  • 18. Algoritmos e Estrutura de Dados I© David Menotti 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)
  • 19. Algoritmos e Estrutura de Dados I© David Menotti 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):  Especifica-se T(n) como uma função dos termos anteriores  Especifica-se a condição de parada (e.g. T(1))
  • 20. Algoritmos e Estrutura de Dados I© David Menotti 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)
  • 21. Algoritmos e Estrutura de Dados I© David Menotti 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)?
  • 22. Algoritmos e Estrutura de Dados I© David Menotti 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) ; } }
  • 23. Algoritmos e Estrutura de Dados I© David Menotti 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: (a0 – rn )/(1-r)
  • 24. Algoritmos e Estrutura de Dados I© David Menotti 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/3K = 1 → n = 3K 1
  • 25. Algoritmos e Estrutura de Dados I© David Menotti Resolvendo a Equação Considerando que T(n/3K ) = T(1) temos: T(n) = Σ (n/3i ) + T(1) = n Σ (1/3i ) + 1 Aplicando a fórmula do somatório de uma PG finita (a0 – rn )/(1-r), temos: n (1 – (1/3)K )/(1 -1/3) + 1 n (1 – (1/3K ))/(1 -1/3) + 1 n (1 – (1/n))/(1 -1/3) + 1 (n – 1)/(2/3) + 1 3n/2 – ½ i=0 K-1 i=0 K-1 O(n)
  • 26. Algoritmos e Estrutura de Dados I© David Menotti Exercício  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?
  • 27. Algoritmos e Estrutura de Dados I© David Menotti Função de Potência Recursiva int pot(int base, int exp) { if (!exp) 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)
  • 28. Algoritmos e Estrutura de Dados I© David Menotti Exercícios  Implemente uma função recursiva para computar o valor de 2n  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); }
  • 29. Algoritmos e Estrutura de Dados I© David Menotti Respostas   Algoritmo de Euclides. Calcula o MDC (máximo divisor comum) de dois números a e b Pot(int n) { if (n==0) return 1; else return 2 * Pot(n-1); }