Recursividade Prof. Alex F. V. Machado [email protected].
Transcript of Recursividade Prof. Alex F. V. Machado [email protected].
![Page 2: Recursividade Prof. Alex F. V. Machado alexcataguases@hotmail.como.](https://reader036.fdocument.pub/reader036/viewer/2022081502/552fc103497959413d8bf023/html5/thumbnails/2.jpg)
Recursão
É o equivalente em programação da indução matemática que é uma maneira de definir algo em
termos de si mesmo.
![Page 3: Recursividade Prof. Alex F. V. Machado alexcataguases@hotmail.como.](https://reader036.fdocument.pub/reader036/viewer/2022081502/552fc103497959413d8bf023/html5/thumbnails/3.jpg)
Conceito de Recursividade
• Um programa recursivo é um programa que chama a si mesmo, direta ou indiretamente
• Conceito poderoso– Define conjuntos infinitos com comandos finitos
• Vantagens– Redução do tamanho do código fonte– Permite descrever algoritmos de forma mais clara e
concisa
• Desvantagens– Redução do desempenho de execução devido ao tempo
para gerenciamento de chamadas– Dificuldades na depuração de programas recursivos,
especialmente se a recursão for muito profunda
![Page 4: Recursividade Prof. Alex F. V. Machado alexcataguases@hotmail.como.](https://reader036.fdocument.pub/reader036/viewer/2022081502/552fc103497959413d8bf023/html5/thumbnails/4.jpg)
Implementação da Recursividade
• Usa-se uma pilha para armazenar os dados usados em cada chamada de um procedimento / função que não terminou
• Todos os dados não globais são armazenados na pilha, informando o resultado corrente
• Quando uma ativação anterior prossegue, os dados da pilha são recuperados
![Page 5: Recursividade Prof. Alex F. V. Machado alexcataguases@hotmail.como.](https://reader036.fdocument.pub/reader036/viewer/2022081502/552fc103497959413d8bf023/html5/thumbnails/5.jpg)
Recursividade
• Existe a recursão direta – quando uma função chama a si mesma diretamente.
• E a recursão indireta – quando uma função chama outra, e esta, por sua vez chama a primeira.
![Page 6: Recursividade Prof. Alex F. V. Machado alexcataguases@hotmail.como.](https://reader036.fdocument.pub/reader036/viewer/2022081502/552fc103497959413d8bf023/html5/thumbnails/6.jpg)
Recursividade
• Uma função pode ser implementada de forma interativa ou recursiva.– quase sempre a forma recursiva apresenta uma
codificação mais simples (reduzida).– Por outro lado, implementações interativas tendem a ser
mais eficientes (performance) que as recursivas.
![Page 7: Recursividade Prof. Alex F. V. Machado alexcataguases@hotmail.como.](https://reader036.fdocument.pub/reader036/viewer/2022081502/552fc103497959413d8bf023/html5/thumbnails/7.jpg)
![Page 8: Recursividade Prof. Alex F. V. Machado alexcataguases@hotmail.como.](https://reader036.fdocument.pub/reader036/viewer/2022081502/552fc103497959413d8bf023/html5/thumbnails/8.jpg)
Funções Recursivas contemduas partes principais
Ou....
Caso Base e Caso Recursivo
![Page 9: Recursividade Prof. Alex F. V. Machado alexcataguases@hotmail.como.](https://reader036.fdocument.pub/reader036/viewer/2022081502/552fc103497959413d8bf023/html5/thumbnails/9.jpg)
1
2
3
4
![Page 10: Recursividade Prof. Alex F. V. Machado alexcataguases@hotmail.como.](https://reader036.fdocument.pub/reader036/viewer/2022081502/552fc103497959413d8bf023/html5/thumbnails/10.jpg)
Tipos de Recursão
- Recursão Linear
- Recursão Binária
- Recursão com Múltiplas Chamadas
![Page 11: Recursividade Prof. Alex F. V. Machado alexcataguases@hotmail.como.](https://reader036.fdocument.pub/reader036/viewer/2022081502/552fc103497959413d8bf023/html5/thumbnails/11.jpg)
Exemplo 1:
Fatorial
/* calculo do fatorial – função recursiva */
int fat(int n)
{
if (n==1){
return 1;
}else{
return n*fat(n-1);
}
}
![Page 12: Recursividade Prof. Alex F. V. Machado alexcataguases@hotmail.como.](https://reader036.fdocument.pub/reader036/viewer/2022081502/552fc103497959413d8bf023/html5/thumbnails/12.jpg)
Exemplo 2:
Fibonacci
/* calculo do valor fibonacci – função recursiva */
int fibonacci(int t){
if (t==1 || t==2) {
return 1;
}else{
return fibonacci (t-1)+fibonacci (t-2);
}
}
![Page 13: Recursividade Prof. Alex F. V. Machado alexcataguases@hotmail.como.](https://reader036.fdocument.pub/reader036/viewer/2022081502/552fc103497959413d8bf023/html5/thumbnails/13.jpg)
Exemplo 3:
Algoritmo de Preenchimento
- Algoritmo recursivo- Preenche vizinhos da semente que atendem ao critério
- Aplica o algoritmo recursivamente tomando esses vizinhos como sementes
- Termina quando nenhum vizinho atende o critério
![Page 14: Recursividade Prof. Alex F. V. Machado alexcataguases@hotmail.como.](https://reader036.fdocument.pub/reader036/viewer/2022081502/552fc103497959413d8bf023/html5/thumbnails/14.jpg)
Exemplo 3:
Algoritmo de Preenchimento
/*considerar pixel[] sendo uma matriz global */void FloodFill (int x, int y, int cor, int novaCor) {
If (pixel [x, y] == cor) {
pixel [x, y] = novaCor;
FloodFill (x + 1, y, cor , novaCor);
FloodFill (x, y + 1, cor , novaCor);
FloodFill (x - 1, y, cor , novaCor);
FloodFill (x, y - 1, cor , novaCor);
}
}
![Page 15: Recursividade Prof. Alex F. V. Machado alexcataguases@hotmail.como.](https://reader036.fdocument.pub/reader036/viewer/2022081502/552fc103497959413d8bf023/html5/thumbnails/15.jpg)
Exercícios:
1. Crie uma função recursiva que calcule a exponenciação de um valor b por um expoente p sem usar o operador de exponenciação.
2. Escreva uma função recursiva que escreva na tela todos os números inteiros positivos desde um valor K informado pelo usuário até 0.
3. Escreva um algoritmo recursivo que escreva na tela a soma de todos os números inteiros positivos de K até 0.
4. Escreva uma função recursiva que calcule a soma de todos os números compreendidos entre os valores A e B passados por parâmetro.
5. Escreva uma função recursiva que calcule os juros compostos de um valor. Para isso o programa deverá ler um valor inicial, o número de meses e a taxa de juros ao mês, e passar estes valores à função como parâmetros.
6. Escreva uma função que faça a procura sequencial de um valor passado por parâmetro num vetor também passado por parâmetro.
![Page 16: Recursividade Prof. Alex F. V. Machado alexcataguases@hotmail.como.](https://reader036.fdocument.pub/reader036/viewer/2022081502/552fc103497959413d8bf023/html5/thumbnails/16.jpg)
Exemplo 4:
Potência
/*calculo da potencia – função recursiva */
double potencia (float b, int p) {
if (p==0) return 1;
else
return b*potencia(b, p-1);
}
![Page 17: Recursividade Prof. Alex F. V. Machado alexcataguases@hotmail.como.](https://reader036.fdocument.pub/reader036/viewer/2022081502/552fc103497959413d8bf023/html5/thumbnails/17.jpg)
Exemplo 5:
Busca Bináriaint busca (int chave, int inicio, int final, int v[]){
int meio;
if (inicio >= final){ // se ini == fim
return v[final];
}
else {
meio = (inicio + final)/2;
if(v[meio] == chave) return v[meio];
if (v[meio] < chave)
return busca (chave, meio + 1, final, v);
else
return busca (chave, inicio, meio - 1, v);
}
}