Buscar

recursão

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 5 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Recursividade:	
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, veja esse exemplo na linguagem C:
Exemplo clássico de recursividade: fatorial
	1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
	//Cálculo de fatorial com função recursiva
#include <stdio.h>
#include <conio.h>
 
//protótipo da função fatorial
double fatorial(int n);
 
int main(void)
{
  int numero;
  double f;
 
  printf("Digite o numero que deseja calcular o fatorial: ");
  scanf("%d",&numero);
 
  //chamada da função fatorial
  f = fatorial(numero);
 
  printf("Fatorial de %d = %.0lf",numero,f);
 
  getch();
  return 0;
}
 
//Função recursiva que calcula o fatorial
//de um numero inteiro n
double fatorial(int n)
{
 
  double vfat;
 
  if ( n <= 1 )
     //Caso base: fatorial de n <= 1 retorna 1
     return (1);
  else
  {
     //Chamada recursiva
     vfat = n * fatorial(n - 1);
     return (vfat);
  }
}
	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. Lembre-se 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.
Toda recursividade é composta por um caso base e pelas chamadas recursivas.
Caso base: é o caso mais simples. É usada uma condição em que se resolve o problema com facilidade.
Chamadas Recursivas: procuram simplificar o problema de tal forma que convergem para o caso base.
Vantagens da recursividade
Torna a escrita do código mais simples e elegante, tornando-o fácil de entender e de manter.
Desvantagens da recursividade
Quando o loop recursivo é muito grande é consumida muita memória nas chamadas a diversos níveis de recursão, pois cada chamada recursiva aloca memória para os parâmetros, variáveis locais e de controle.
Em muitos casos uma solução iterativa gasta menos memória, e torna-se mais eficiente em termos de performance do que usar recursão.
Recursão de Cauda:
·A recursão de cauda é uma técnica de recursão que faz menos uso de memória durante o processo de empilhamento, o que a torna mais rápida que a recursão comum.
·Em uma recursão comum, a cada chamada recursiva realizada, é necessário guardar a posição do código onde foi feita a chamada para que continue a partir dali assim que receber o resultado. Logo, como dito anteriormente, se Fibonacci (32) faz 7.049.155 chamadas recursivas, também serão necessárias 7.049.155 variáveis para armazenar a posição onde foi feita a chamada.
·Em uma recursão de cauda, não é necessário guardar a posição onde foi feita a chamada, visto que a chamada é a última operação realizada pela função.
·Exemplo: o fatorial de um inteiro n não-negativo, escrito n! é o produto n ´ (n -1) ´ (n -2) ´K´1.
O cálculo recursivo do fatorial de n pode ser feito como a seguir:
1: int fatorial(int num)
2: {
3: if (num == 1)
4: return num;
5: else
6: return num * fatorial(num - 1);
7: }
Note que após receber o resultado da chamada recursiva (linha 6) ele deve ser multiplicado por n. Daí a necessidade de uma variável para guardar a posição onde foi feita a chamada recursiva. Uma recursão de cauda é aquela onde a chamada recursiva é a última operação a ser realizada pela função recursiva. A função fatorial_cauda()a seguir implementa a recursão de cauda para o fatorial:
1: int fatorial_aux(int num, int parcial)
2: {
3: if (num == 1)
4: return parcial;
5: else
6: return fatorial_aux((num - 1), (parcial * num));
7: }
9: int fatorial_cauda(int num)
10: {
11: return fatorial_aux(num, 1);
12: }
Nesse caso, o conceito da avaliação do caso base é diferente. Embora exista uma checagem deste caso na função fatorial_aux() (linha 3), o problema inicial não é reduzido até este ponto para que então a função retorne a resposta deste caso (ou seja, fatorial(1) = 1). O que acontece é uma transcrição direta de um cálculo iterativo: passa-se inicialmente o valor parcial 1 para a função fatorial_aux() (linha 11) e ela “atualiza” este valor a cada chamada recursiva, multiplicando o cálculo parcial do fatorial por n, n – 1, n – 2, …, até o “caso base”. Neste ponto, o valor do fatorial já foi calculado e é apenas retornado (linha 4).
Recursão versus Iteração:
Tem-se a seguir uma comparação entre as duas abordagens de implementação para que o programador possa escolher qual a ideal de acordo com uma situação em particular:
Mesmo diminuindo-se os gastos de memória da recursão através de uma implementação que usa recursão de cauda e passagem de parâmetros por referência, o cálculo iterativo será comumente mais rápido por não fazer repetidas chamadas de funções. No entanto, a recursão de cauda é importante principalmente em linguagens de programação funcionais (por exemplo, a linguagem Scheme), onde não existem estruturas de repetição. Neste caso, a recursão é a única abordagem disponível e o desempenho pode ser fator crítico, exigindo implementações de recursão de cauda.

Continue navegando

Outros materiais