Carregar apresentação
A apresentação está carregando. Por favor, espere
1
Recursividade Estrutura de Dados
2
Definição Um algoritmo é dito recursivo quando ele chama a si mesmo ou chama uma seqüência de outros algoritmos, e um deles chama novamente o primeiro algoritmo. Estrutura de Dados
3
Recursividade Divisão do problema original em pequenas ocorrências
Dividir para conquistar (divide and conquer) A dificuldade não está só no reconhecimento das situações Mas também no equilíbrio entre espaço (memória ocupada) e tempo (tempo de execução) E manter ao mesmo tempo uma boa compreensão da solução do problema Estrutura de Dados
4
A função fatorial n! = n x (n-1) x . . .x 1 Uma definição mais precisa
Calculando 4 ! usando a última definição, faríamos: 4! = 4 x 3! = 4 x (3 x 2!) = 4 x (3 x (2 x 1)) = 4 x (3 x (2 x (1 x 0!))). = 4 x (3 x (2 x (1 x 1))) = 4 x (3 x 2) = 4 x 6 = 24 Estrutura de Dados
5
Todo processo recursivo consiste de duas partes
Solução trivial: Dada por definição, obtida sem recursão. Solução geral: Parte do problema que em essência é igual ao problema original, sendo porém menor. Estrutura de Dados
6
Versão recursiva para calcular o fatorial
/* fatorial : versão recursiva Pré-condição : n é um inteiro não negativo Pós-condição : retorna o valor do fatorial de n */ int fatorial(int n) { if(n == 0) return 1; else return n*fatorial(n-1); } Estrutura de Dados
7
Chamando a função: fatorial(3)
Estrutura de Dados
8
Utilizando árvore de recursão
float ex(float a, float b) { if (a >= b) return((a+b)/2); else return(ex(ex(a+2,b-1),ex(a+1, b-2))); } Estrutura de Dados
9
Utilizando árvore de recursão
Estrutura de Dados
10
Rotinas recursivas e pilhas
Controle de chamadas e retornos de rotinas com pilha Quando uma rotina é chamada, empilha-se o endereço de retorno + todas as variáveis locais Quando ocorre o retorno da rotina, as variáveis locais que foram criadas deixam de existir Estrutura de Dados
11
Observações sobre um algoritmo recursivo
Pode ser conciso e elegante Pode ser difícil a compreensão dos detalhes de seu funcionamento computacional Pode requerer um exaustivo acompanhamento do programa O computador pode utilizar pilhas para esse controle A mente humana não é tão boa para tais tarefas Parece ser difícil para uma pessoa guardar uma longa seqüência de resultados e então voltar para terminar um trabalho Estrutura de Dados
12
Para facilitar o acompanhamento, podemos utilizar
Ilustrações especiais Árvores de Recursão Estrutura de Dados
13
Mais um exemplo MDC (máximo divisor comum)
int mdc(int p1, int p2) { if(p2 == 0) mdc = p1; else mdc = mdc(p2, p1%p2); } Estrutura de Dados
14
Alguns resultados mdc (6,12) = 6 mdc (12,20) = 4 mdc (20,24) = 4
Estrutura de Dados
15
Desenvolvendo algoritmos recursivos
Ache o passo chave Como este problema pode ser dividido? Como posso desenvolver o passo chave da solução? Ache uma regra de parada Uma regra de parada indica que o problema ou uma parte razoável do mesmo foi feito Ela é geralmente pequena e dá a solução trivial, sem a necessidade da recursão Monte seu algoritmo Combine a regra de parada e o “passo chave” usando uma instrução if Estrutura de Dados
16
Desenvolvendo algoritmos recursivos
Verifique o término Certificar que a recursão sempre terminará Comece com uma situação geral Verifique se num número finito de passos, a regra de parada será satisfeita e a recursão termina Desenhe uma árvore de recursão É a ferramenta chave para analisar algoritmos recursivos Estrutura de Dados
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.