Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

Recursividade

  • Loggen Sie sich ein, um Kommentare anzuzeigen.

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 />

×