Você está na página 1de 4

19/10/2023

Recursão

Definições recursivas
• Uma definição recursiva consiste em duas partes:
1. Âncora (ou caso base): os elementos básicos que são os blocos fundamentais de todos os
outros elementos do conjunto são listados
2. Regras que permitem a construção de novos objetos a partir dos elementos básicos ou de
elementos que já tenham sido construídos
• Exemplo: conjunto de números naturais
1. 0 ∈ ℕ
2. Se 𝑛 ∈ ℕ, então 𝑛 + 1 ∈ ℕ
3. Não existem outros objetos no conjunto ℕ
• A partir dessa definição, o conjunto dos naturais é: 0, 0+1, 0+1+1, ...
• É mais conveniente usar a seguinte definição:
1. 0,1,2,3,4,5,6,7,8,9 ∈ ℕ
2. Se 𝑛 ∈ ℕ, então 𝑛0, 𝑛1, 𝑛2, 𝑛3, 𝑛4, 𝑛5, 𝑛6, 𝑛7, 𝑛8, 𝑛9 ∈ ℕ
3. Esses são os únicos números naturais

2
19/10/2023

Definições recursivas
• Definições recursivas são frequentemente usadas para definir funções e sequências de
números
• Fatorial
1 se n=0 (âncora)
𝑛! =
𝑛 𝑛−1 ! se n>0 (passo indutivo)
• Usando essa definição, é possível gerar a sequência: 1, 1, 2, 6, 24, 120, 720, ...
• Desvantagem: para chegar a uma valor s , precisamos computar os valores 𝑠 , … 𝑠 , o que
pode ser computacionalmente caro
• Para calcular 3!, é preciso calcular 0!, 1! e 2!
• É preferível o uso de fórmulas (caso existam)
• Exemplo:
1 se n=0
𝑔 𝑛 =
2 𝑔 𝑛−1 se n>0
• Pode ser convertido em: 𝑔 𝑛 = 2

Definições recursivas
• Definições recursivas são frequentemente usadas para definir funções e sequências de
números
• Fatorial
1 se n=0 (âncora)
𝑛! =
𝑛 𝑛−1 ! se n>0 (passo indutivo)

• Código equivalente em C++:

4
19/10/2023

Chamadas de função e implementação da recursão


main() chama f1(), f1()
• Registros de ativação (Activation records) chama f2() e f2() chama f3()

• Parte da memória (stack) reservada para um processo


armazenar informações sobre a chamada de uma função:
• Valores de todos os parâmetros da função, localização da
primeira posição caso um vetor seja passado por referência e
cópias de todos os outros itens
• Variáveis locais
• Endereço de retorno para retomar o controle pelo chamador, o
endereço da instrução imediatamente após a chamada
• Um link dinâmico, que é um ponteiro para o registro de ativação
do chamador
• O valor retornado

Anatomia de uma chamada recursiva


• Potenciação de um número
1 se n=0
𝑥 = se n>0
𝑥 𝑥

6
19/10/2023

Anatomia de uma chamada recursiva


• Potenciação de um número
1 se n=0
𝑥 = se n>0
𝑥 𝑥

Você também pode gostar