Compilação – Material sobre recursividade

Propaganda
Recursividade
Na linguagem C, assim como em muitas outras linguagens de programação,
uma função pode chamar a si própria. Uma função assim é chamada função
recursiva. Todo cuidado é pouco ao se fazer funções recursivas. A primeira
coisa a se providenciar é um critério de parada. Este vai determinar quando a
função deverá parar de chamar a si mesma. Isto impede que a função se chame
infinitas vezes.
Uma função que calcule o fatorial de um número inteiro n é um bom exemplo
de uma função recursiva:
#include <stdio.h>
int fat(int n)
{
if (n)
return n*fat(n-1)
else return 1;
}
int main()
{
int n;
printf("\n\nDigite um valor para n: ");
scanf("%d", &n);
printf("\nO fatorial de %d e' %d", n, fat(n));
return 0;
}
Note que, enquanto n não for igual a 0, a função fat chama a si mesma, cada
vez com um valor menor. n=0 é critério de parada para esta função.
Há certos algoritmos que são mais eficientes quando feitos de maneira
recursiva, mas a recursividade é algo a ser evitado sempre que possível, pois,
se usada incorretamente, tende a consumir muita memória e ser lenta. Lembrese que memória é consumida cada vez que o computador faz uma chamada a
uma função. Com funções recursivas a memória do computador pode se esgotar
rapidamente.
Outro Exemplo:
Crie um programa em C que peça um número inteiro ao usuário e
retorne a soma de todos os números de 1 até o número que o usuário
introduziu ou seja: 1 + 2 + 3 + ... + n
Utilize recursividade.
Vamos criar uma função soma(int n).
Se n=5, essa função deve retornar: soma(5) = 5 + 4 + 3 + 2 + 1
Se n=4, essa função deve retornar: soma(4) = 4 + 3 + 2 + 1
Se n=3, essa função deve retornar: soma(3) = 3 + 2 + 1
E assim por diante. Porém, para fazermos uso da brilhante idéia matemática
da recursividade, temos que notar padrões.
Veja que:
soma(5) = 5 + 4 + 3 + 2 +1 = 5 + soma(4)
O mesmo para:
soma(4) = 4 + 3 + 2 + 1 = 4 + soma(3)
Ou seja, temos a fórmula geral:
soma(n) = n + soma(n-1)
Concorda?
Ou seja:
soma(n) = n + soma(n-1) = n + (n-1) + soma(n-2) = n + (n-1) + (n-2) +
soma(n-3)...
E onde essa soma para? Para quando o último elemento dessa soma for 1.
Então:
soma(n) = n +(n-1) + (n-2) + (n-3) + .... + 1
Agora vamos traduzir essa fórmula em termos de programação.
A função recebe um número, e a primeira coisa que ela deve fazer é ver se
esse valor é 1.
Se for, deve retornar 1, afinal:
soma(1) = 1
E se não for 1, deve retornar:
n + soma(n-1)
Isso é feito da uma maneira muito simples, através de um simples teste
condicional do tipo IF ELSE.
Veja como ficou nosso código em C:
#include <stdio.h>
int soma(int n)
{
if(n == 1)
return 1;
else
return ( n + soma(n-1) );
}
int main()
{
int n;
printf("Digite um inteiro positivo: ");
scanf("%d", &n);
printf("Soma: %d\n", soma(n));
}
----------------------------------------------------------------------------------------Exercícios em linguagem C:
1) O programa abaixo implementa duas funções para multiplicar dois
números, sendo uma iterativa e outra recursiva. Analise as duas
chamadas no programa principal e informe passo a passo o resultado
obtido em cada uma.
#include <stdio.h>
long int mult(int x, int y){
long int res=0;
while( y != 0){
res += x; y--;
}
return(res);
}
long int multRec(int x, int y) {
if (y == 0)
return 0;
else
return(x + multRec(x, y-1));
}
int main(){
printf("\nResultado Iterativo: %d",mult(5,600));
printf("\nResultado Recursivo: %d\n\n",multRec(5,600));
return 0;
}
Exercícios 
http://homepages.dcc.ufmg.br/~olmo/exercicios_recursividade.pdf
Download