Recursão matemática
Recursão é uma ideia importante usada para definir sequências de objetos, coleções mais gerais de objetos e operações sobre objetos: um objeto é definido em termos de si mesmo, mas com valores anteriores ou menores.
Recursão é o espelho da indução
Uma definição recursiva e uma prova por indução seguem exatamente a mesma estrutura de duas partes: o termo inicial corresponde ao passo básico, e a fórmula de recorrência corresponde ao passo indutivo. Não é coincidência: provar propriedades de sequências recursivas (como as fórmulas fechadas do exercício sobre a Torre de Hanói) é, tipicamente, feito por indução.
Sequências recursivas
Uma sequência é uma lista de objetos enumerados segundo alguma ordem: há um primeiro objeto, um segundo, e assim por diante. denota o -ésimo objeto da sequência. Uma definição recursiva de uma sequência possui duas partes: o(s) termo(s) inicial(is) e uma fórmula de recorrência que define em função de termos anteriores.
Exemplo: sequência S(1)=2, S(n)=2·S(n-1)
1 / 3- 1
Definição
Determine .
Exercício proposto
Determine os primeiros termos da sequência , definida recursivamente por , e , para .
Resposta
Logo: .
Exercício proposto
Escreva recursivamente uma sequência para determinar a quantidade de movimentos necessários para resolver a Torre de Hanói, cujos primeiros termos são
Resposta
Cada termo é o dobro do anterior mais :
Exercício proposto
Encontre uma forma recursiva para a sequência de Fibonacci
Resposta
Algoritmos recursivos
Um algoritmo é um conjunto finito de instruções precisas para realizar uma operação computacional ou resolver um problema. Um algoritmo é recursivo se resolve um problema reduzindo-o ao mesmo problema com valores iniciais menores, até alcançar um caso base que é resolvido diretamente.
Exercício proposto
Projete um algoritmo recursivo, em pseudocódigo, que calcule o -ésimo termo da sequência de Fibonacci.
Resposta
function FIB(n):
begin
if n == 0:
return 0;
elif n == 1:
return 1;
else:
return FIB(n - 2) + FIB(n - 1);
end;
A árvore de chamadas real é bem maior que o rastro abaixo
O rastro a seguir mostra os valores em ordem crescente de , de baixo
para cima — útil para ver o resultado final, mas não é como FIB de fato
executa. Na chamada real, FIB(8) dispara FIB(7) e FIB(6); FIB(7)
dispara FIB(6) e FIB(5); e assim por diante — o mesmo valor (como
FIB(6)) acaba sendo recalculado do zero várias vezes, em uma árvore
que cresce exponencialmente com . Por isso essa versão recursiva
"ingênua" de Fibonacci é lenta para grande, mesmo sendo curta de
escrever.
Exercício proposto
Trace a execução do algoritmo da questão anterior para .
Resposta
Exercício proposto
Projete um algoritmo recursivo, em pseudocódigo, que calcule , onde e .
Resposta
function p(a, n):
begin
if n == 1:
return a;
else:
return a * p(a, n - 1);
end;
Exercício proposto
Trace a execução do algoritmo da questão anterior para .
Resposta