Sie sind auf Seite 1von 17

Recursividade

Prof. Alex F. V. Machado


alexcataguases@hotmail.como

Recurso

o equivalente em programao da induo


matemtica que uma maneira de definir algo em
termos de si mesmo.

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
Reduo do tamanho do cdigo fonte
Permite descrever algoritmos de forma mais clara e
concisa

Desvantagens
Reduo do desempenho de execuo devido ao tempo
para gerenciamento de chamadas
Dificuldades na depurao de programas recursivos,
especialmente se a recurso for muito profunda

Implementao da Recursividade
Usa-se uma pilha para armazenar os dados
usados em cada chamada de um procedimento /
funo que no terminou
Todos os dados no globais so armazenados na
pilha, informando o resultado corrente
Quando uma ativao anterior prossegue, os
dados da pilha so recuperados

Recursividade

Existe a recurso direta quando uma funo


chama a si mesma diretamente.
E a recurso indireta quando uma funo chama
outra, e esta, por sua vez chama a primeira.

Recursividade
Uma funo pode ser implementada de forma
interativa ou recursiva.
quase sempre a forma recursiva apresenta uma
codificao mais simples (reduzida).
Por outro lado, implementaes interativas tendem a ser
mais eficientes (performance) que as recursivas.

Funes Recursivas contem


duas partes principais

Ou....
Caso Base e Caso Recursivo

2
3
4

Tipos de Recurso

- Recurso Linear
- Recurso Binria
- Recurso com Mltiplas Chamadas

Exemplo 1:

Fatorial
/* calculo do fatorial funo recursiva */
int fat(int n)
{
if (n==1){
return 1;
}else{
return n*fat(n-1);
}
}

Exemplo 2:

Fibonacci
/* calculo do valor fibonacci funo recursiva */
int fibonacci(int t){
if (t==1 || t==2) {
return 1;
}else{
return fibonacci (t-1)+fibonacci (t-2);
}
}

Exemplo 3:

Algoritmo de Preenchimento
- Algoritmo recursivo
- Preenche vizinhos da semente que atendem ao
critrio
- Aplica o algoritmo recursivamente tomando esses
vizinhos como sementes
- Termina quando nenhum vizinho atende o critrio

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);
}
}

Exerccios:
1.

Crie uma funo recursiva que calcule a exponenciao de


um valor b por um expoente p sem usar o operador de
exponenciao.

2.

Escreva uma funo recursiva que escreva na tela todos os


nmeros inteiros positivos desde um valor K informado pelo
usurio at 0.

3.

Escreva um algoritmo recursivo que escreva na tela a soma


de todos os nmeros inteiros positivos de K at 0.

4.

Escreva uma funo recursiva que calcule a soma de todos


os nmeros compreendidos entre os valores A e B passados
por parmetro.

5.

Escreva uma funo recursiva que calcule os juros


compostos de um valor. Para isso o programa dever ler um
valor inicial, o nmero de meses e a taxa de juros ao ms, e
passar estes valores funo como parmetros.

6.

Escreva uma funo que faa a procura sequencial de um


valor passado por parmetro num vetor tambm passado por
parmetro.

Exemplo 4:

Potncia
/*calculo da potencia funo recursiva */
double potencia (float b, int p) {
if (p==0) return 1;
else
return b*potencia(b, p-1);
}

Exemplo 5:

Busca Binria
int 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);
}
}

Das könnte Ihnen auch gefallen