Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
*
Recursividade
*
Se um problema pode ser resolvido facilmente,
resolva o problema;
Se o problema é grande,
elabore uma solução menor do problema,
relacione com o problema maior,
resolva o problema menor,
volte ao problema inicial.
Motivação
*
Definição
Um objeto é dito recursivo se ele consistir parcialmente ou for definido em termos de si mesmo.
Uma função recursiva é uma função que faz uma chamada a si mesma.
*
Recursão Direta ou Indireta
Se uma função A contiver uma chamada explícita a si mesma, essa função é dita diretamente recursiva.
A A
Se uma função A contiver uma chamada a uma função B, que por sua vez contenha uma chamada a função A, a função A é dita indiretamente recursiva.
A B
B A
*
Todo problema recursivo deve ter
Um caso base que pode ser resolvido diretamente;
Um passo recursivo que envolve um problema menor.
Caso base interrompe a recursão.
Passos recursivos deve caminhar para caso base.
Recursão
*
Um exemplo
Fatorial de um número.
1! = 1
2! = 2 * 1
3! = 3 * 2 *1
4! = 4 * 3 * 2 * 1
5! = 5 * 4 * 3 * 2 * 1
5!
*
Função recursiva
Dado um problema:
Subdivide este problema em problemas menores (mais simples) e chama a mesma função para resolvê-lo.
Para de subdividir quando chega em um problema trivial.
*
Voltando ao exemplo
Valor Final = 120
*
Função Fatorial Recursiva
Dado o problema do fatorial de um número:
n! = n * (n – 1)! para n>1
1! = 1
0! = 1
*
Implementando em C
int fatorial(int n)
{
if(n = = 1 || n == 0)
return 1;
else
return n * fatorial(n-1);
}
*
Chamadas recursivas
fat = fatorial(5);
*
Chamadas recursivas
fat = fatorial(5);
*
Chamadas recursivas
fat = fatorial(5);
*
Chamadas recursivas
fat = fatorial(5);
*
Chamadas recursivas
fat = fatorial(5);
*
Chamadas recursivas
fat = 120
fat = fatorial(5);
*
Exemplo
Escreva uma função que recebe como parâmetro um inteiro positivo n e retorna a soma de todos os números inteiros entre 1 e n.
n = 1 → Soma(1) = 1
n = 2 → Soma(2) = 2 + Soma(1)
n = 3 → Soma(3) = 3 + Soma(2)
…
Genericamente: Soma(n) = n + Soma(n-1)
*
Solução Recursiva:
int Soma (int n)
{
if (n == 1)
{
return 1;
}
else
{
return n + Soma (n - 1);
}
}
Exemplo
*
Chamada inicial para a função recursiva :
Exemplo
int main ()
{
int n;
printf ("Qual o valor de n? ");
scanf ("%d", &n);
printf ("O somatorio de 0 a %d :", n);
printf ("%d", Soma(n));
}
*
Exemplo
Série de Fibonacci
*
Exemplo
int Fibonacci (int n)
{
if (n == 0 || n == 1)
{
return n;
}
else
{
return Fibonacci(n-1) + Fibonacci(n-2);
}
}
*
É melhor não usar recursão:
Quando as chamadas recursivas acontecem apenas no início ou apenas no fim da função
Motivo: cada chamada recursiva reserva memória para as variáveis locais e parâmetros
Exemplos: as funções somatório e fatorial
Quando o número de tarefas/cálculos repetidos é muito grande, a execução de um programa pode ficar inviável
Motivo: em geral, cada chamada recursiva é independente da outra; se duas chamadas recursivas realizam os mesmos cálculos, esses cálculos serão repetidos
Exemplo: a função recursiva para a série de Fibonacci
Recursão
*
Escreva um programa que contenha uma função recursiva que calcule be, em que b e e são números inteiros positivos.
O produto entre dois números inteiros sempre pode ser calculado utilizando-se apenas o operador de adição.
Assim: 2 * 3 = 2 + 2 + 2
Ou seja: x * y = x + x + ...+ x (y vezes)
Escreva uma função recursiva para o cálculo do produto de dois números, usando apenas o operador de soma.
Escreva um programa que contenha uma função recursiva que receba um número natural n, e devolva a soma dos n primeiros números naturais ímpares.
Exercícios
*