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

Contenu connexe

Tendances

Programação Estruturada 2 - Aula 05
Programação Estruturada 2 - Aula 05Programação Estruturada 2 - Aula 05
Programação Estruturada 2 - Aula 05thomasdacosta
 
Merge & Quick Algorithms - Implementation in C++
Merge & Quick Algorithms - Implementation in C++Merge & Quick Algorithms - Implementation in C++
Merge & Quick Algorithms - Implementation in C++Michel Alves
 
2 funcoes e estrutura de blocos
2   funcoes e estrutura de blocos2   funcoes e estrutura de blocos
2 funcoes e estrutura de blocosRicardo Bolanho
 
Código Limpo: Objetos e Estruturas de Dados cap6
Código Limpo: Objetos e Estruturas de Dados cap6Código Limpo: Objetos e Estruturas de Dados cap6
Código Limpo: Objetos e Estruturas de Dados cap6Inael Rodrigues
 
Curso Básico de Java - Aula 10
Curso Básico de Java - Aula 10Curso Básico de Java - Aula 10
Curso Básico de Java - Aula 10PeslPinguim
 
Lista encadeada de inteiros
Lista encadeada de inteirosLista encadeada de inteiros
Lista encadeada de inteirosRobson Eduardo
 

Tendances (7)

Programação Estruturada 2 - Aula 05
Programação Estruturada 2 - Aula 05Programação Estruturada 2 - Aula 05
Programação Estruturada 2 - Aula 05
 
Aula apontadores
Aula apontadoresAula apontadores
Aula apontadores
 
Merge & Quick Algorithms - Implementation in C++
Merge & Quick Algorithms - Implementation in C++Merge & Quick Algorithms - Implementation in C++
Merge & Quick Algorithms - Implementation in C++
 
2 funcoes e estrutura de blocos
2   funcoes e estrutura de blocos2   funcoes e estrutura de blocos
2 funcoes e estrutura de blocos
 
Código Limpo: Objetos e Estruturas de Dados cap6
Código Limpo: Objetos e Estruturas de Dados cap6Código Limpo: Objetos e Estruturas de Dados cap6
Código Limpo: Objetos e Estruturas de Dados cap6
 
Curso Básico de Java - Aula 10
Curso Básico de Java - Aula 10Curso Básico de Java - Aula 10
Curso Básico de Java - Aula 10
 
Lista encadeada de inteiros
Lista encadeada de inteirosLista encadeada de inteiros
Lista encadeada de inteiros
 

En vedette

Recursividade em C
Recursividade em CRecursividade em C
Recursividade em CCaique Silva
 
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
 
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
 
Logica Algoritmo 08 Recursividade
Logica Algoritmo 08 RecursividadeLogica Algoritmo 08 Recursividade
Logica Algoritmo 08 RecursividadeRegis Magalhães
 

En vedette (6)

Recursividade em C
Recursividade em CRecursividade em C
Recursividade em C
 
Recursividade
RecursividadeRecursividade
Recursividade
 
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
 
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
 
Recursividade
RecursividadeRecursividade
Recursividade
 
Logica Algoritmo 08 Recursividade
Logica Algoritmo 08 RecursividadeLogica Algoritmo 08 Recursividade
Logica Algoritmo 08 Recursividade
 

Plus de edgarddavidson.com

qualidade de código: boas práticas, princípios e padrões
qualidade de código: boas práticas, princípios e padrõesqualidade de código: boas práticas, princípios e padrões
qualidade de código: boas práticas, princípios e padrõesedgarddavidson.com
 
Pós Graduação em Engenharia de Software Centrada em Métodos Ágeis
Pós Graduação em Engenharia de Software Centrada em Métodos ÁgeisPós Graduação em Engenharia de Software Centrada em Métodos Ágeis
Pós Graduação em Engenharia de Software Centrada em Métodos Ágeisedgarddavidson.com
 
Localização de Placas de Veículos Baseada em Métodos Estatísticos
Localização de Placas de Veículos Baseada em Métodos EstatísticosLocalização de Placas de Veículos Baseada em Métodos Estatísticos
Localização de Placas de Veículos Baseada em Métodos Estatísticosedgarddavidson.com
 
Localização de Placas de Veículos Baseada em Métodos Estatísticos
Localização de Placas de Veículos Baseada em Métodos EstatísticosLocalização de Placas de Veículos Baseada em Métodos Estatísticos
Localização de Placas de Veículos Baseada em Métodos Estatísticosedgarddavidson.com
 

Plus de edgarddavidson.com (10)

O programador pragmático
O programador pragmáticoO programador pragmático
O programador pragmático
 
Scrum checklists
Scrum checklistsScrum checklists
Scrum checklists
 
Scrum checklist
Scrum checklistScrum checklist
Scrum checklist
 
Scrum checklist pt-br
Scrum checklist pt-brScrum checklist pt-br
Scrum checklist pt-br
 
qualidade de código: boas práticas, princípios e padrões
qualidade de código: boas práticas, princípios e padrõesqualidade de código: boas práticas, princípios e padrões
qualidade de código: boas práticas, princípios e padrões
 
Carreira de Professor?
Carreira  de Professor?Carreira  de Professor?
Carreira de Professor?
 
Formei, mas não sei nada!!!
Formei, mas não sei nada!!!Formei, mas não sei nada!!!
Formei, mas não sei nada!!!
 
Pós Graduação em Engenharia de Software Centrada em Métodos Ágeis
Pós Graduação em Engenharia de Software Centrada em Métodos ÁgeisPós Graduação em Engenharia de Software Centrada em Métodos Ágeis
Pós Graduação em Engenharia de Software Centrada em Métodos Ágeis
 
Localização de Placas de Veículos Baseada em Métodos Estatísticos
Localização de Placas de Veículos Baseada em Métodos EstatísticosLocalização de Placas de Veículos Baseada em Métodos Estatísticos
Localização de Placas de Veículos Baseada em Métodos Estatísticos
 
Localização de Placas de Veículos Baseada em Métodos Estatísticos
Localização de Placas de Veículos Baseada em Métodos EstatísticosLocalização de Placas de Veículos Baseada em Métodos Estatísticos
Localização de Placas de Veículos Baseada em Métodos Estatísticos
 

Recursividade

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