Módulo 5Tópico 5 de 5
Recursão matemática
Sequências recursivas e algoritmos recursivos.
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
Determine os primeiros termos da sequência , definida recursivamente por , e , para .
Logo: .
Exercício
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
Cada termo é o dobro do anterior mais :
Exercício
Encontre uma forma recursiva para a sequência de Fibonacci
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
Projete um algoritmo recursivo, em pseudocódigo, que calcule o -ésimo termo da sequência de Fibonacci.
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
Trace a execução do algoritmo da questão anterior para .
Exercício
Projete um algoritmo recursivo, em pseudocódigo, que calcule , onde e .
function p(a, n):
begin
if n == 1:
return a;
else:
return a * p(a, n - 1);
end;
Exercício
Trace a execução do algoritmo da questão anterior para .
Vídeos
Aula 11 - Definições Recorrentes (Recursividade) - Fundamentos Matemáticos para Computação
Aula 12 - Como encontrar a Fórmula Fechada (Recursividade) - Fundamentos Matemáticos para Computação
Aula Extra - Dividir para Conquistar (Recursividade)