SlideShare una empresa de Scribd logo
1 de 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){       ...       ...       ... }

Más contenido relacionado

La actualidad más candente

2 funcoes e estrutura de blocos
2   funcoes e estrutura de blocos2   funcoes e estrutura de blocos
2 funcoes e estrutura de blocos
Ricardo 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 cap6
Inael 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 10
PeslPinguim
 

La actualidad más candente (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
 

Destacado (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
 

Más 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ões
edgarddavidson.com
 

Más 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
 

Último

Último (8)

ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
Programação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdfProgramação Orientada a Objetos - 4 Pilares.pdf
Programação Orientada a Objetos - 4 Pilares.pdf
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
Luís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdfLuís Kitota AWS Discovery Day Ka Solution.pdf
Luís Kitota AWS Discovery Day Ka Solution.pdf
 

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){ ... ... ... }