Recursividade

3.194 visualizações

Publicada em

Publicada em: Tecnologia
0 comentários
1 gostou
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
3.194
No SlideShare
0
A partir de incorporações
0
Número de incorporações
1.141
Ações
Compartilhamentos
0
Downloads
66
Comentários
0
Gostaram
1
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Recursividade

  1. 1. Recursividade<br />Prof. Edgard Davidson C. Cardoso<br />
  2. 2. Introdução<br />Um método é considerado recursivo quando possui uma chamada para si próprio<br /> f(int x){<br /> ....<br /> f(x)<br /> }<br />Um método recursivo pode ser chamado direta ou indiretamente por outro método.<br />f() -> g() -> f()<br />
  3. 3. Introdução<br />Condições para a aplicação da recursividade<br />O problema possa ser decomposto em subproblemas que representem instâncias menores daquele original<br />O processo de decomposição seja finito e limitado, ou seja, a cada nova instância o subproblema resultante é menor que o antecede, e o número de instâncias não seja grande.<br />
  4. 4. Introdução<br />Em geral, há dois tipos básicos de problemas que admitem soluções recursivas:<br />Os que são compostos por problemas que apresentam uma decomposição naturalmente recursiva em subproblemas de mesma classe, como o cálculo do fatorial de um número;<br />Os problemas que tratam estruturas de dados naturalmente recursivas, como as listas encadeadas, as árvores ou algoritmos de ordenação como MergeSort, QuickSort<br />
  5. 5. Algoritmo Recursivo<br />Algoritmo recursivo<br /> Início<br /> Se a condição de término for atingida<br /> então <br /> Resolver o problema<br /> senão <br /> Partir o problema em problemas mais pequenos, <br /> usando para esse efeito, uma ou mais invocações recursivas<br /> Fim<br />
  6. 6. Algoritmo Recursivo X Não Recursivo<br />Implementação não Recursiva<br />intFatorial (int N){ <br />int i, fat= 1;<br />if(N < 0) return0; // invocação anormal (valor devolvido 0) <br /> for (i = 2; i <= N; i++) <br />fat= fat* i; // cálculo do produto<br />returnfat; // devolução do valor calculado<br />}<br />
  7. 7. Algoritmo Recursivo X Não Recursivo<br />Implementação Recursiva<br />intFatorial (int N){<br />if(N < 0) return 0; // invocação anormal (valor devolvido 0)<br />if(N == 0) return 1; // condição de paragem <br />return(N * Fatorial (N-1)); // invocação recursiva<br />}<br />
  8. 8. Inserção em uma árvore binária<br />voidinsereRecursivo(eMatriz *elem, NodoAB *sub) {<br />if(elem < sub->valor){<br />if(sub->esq == NULL)<br /> sub->esq = newNodoAB(elem, NULL, NULL);<br />else<br />insereRecursivo(elem, sub->esq);<br /> }<br />else{<br />if(sub->dir == NULL)<br /> sub->dir = newNodoAB(elem, NULL, NULL);<br />else<br />insereRecursivo(elem, sub->dir);<br /> }<br /> }<br />void Arvore::insere(eMatriz *elem){<br />if(raiz == NULL)<br />raiz = newNodoAB(elem, NULL, NULL);<br />else<br />insereRecursivo(elem, raiz);<br /> }<br />
  9. 9. Recursão Excessiva<br />A sequência produzida pela definição é:<br />0,1,1,2,3,5,8,13,21,34,55,89,...<br />unsignedintFib (unsignedint n){<br />if (n < 2)<br />return n;<br />else<br />returnFib(n-2) + Fib (n-1);<br />}<br />
  10. 10. Recursão Excessiva<br />A função é de fácil entendimento, mas extremamente ineficiente.<br />F(6)<br />F(4)<br />F(5)<br />F(2)<br />F(3)<br />F(3)<br />F(4)<br />F(1)<br />F(2)<br />F(1)<br />F(2)<br />F(0)<br />F(1)<br />F(2)<br />F(3)<br />F(0)<br />F(1)<br />F(0)<br />F(1)<br />0<br />1<br />1<br />1<br />F(1)<br />F(2)<br />F(0)<br />F(1)<br />0<br />1<br />0<br />1<br />F(0)<br />F(1)<br />0<br />1<br />1<br />0<br />1<br />
  11. 11. Recursão Excessiva<br />Comparação dos algoritmos iterativo e recursivo para calcular os números de Fibonacci.<br />
  12. 12. Conclusão<br />Recursão deve ser usada com critério<br />Usualmente é menos eficiente que seu equivalente iterativo<br />Há vantagem em clareza, legibilidade e simplicidade de código.<br />A conversão para uma versão iterativa nem sempre é uma tarefa trivial<br />Métodos recursivos podem ser substituídos por estruturas de pilhas<br />
  13. 13. Atividade<br />Dado:<br />Escrever uma função recursiva que eleve qualquer número x a uma potência inteira não negativa n.<br />doube potencia (double x, unsignedint n){<br /> ...<br /> ...<br /> ...<br />}<br />

×