Programação recursiva
Na recursão, o caso base representa a solução do subproblema mais simples possível e o passo indutivo (ou caso geral) representa a solução de todas as outras situações.
Agora, iremos ver como converter essa formulação recursiva para a implementação da recursividade em JavaScript.
Nesta seção, são destacados dois padrões que devem ser lembrados, para auxiliar na solução de futuros problemas.
N-ésimo elemento de uma sequência infinita
Exemplo
Observe a sequência aritmética a seguir e crie um programa para encontrar o valor do n-ésimo elemento: \( {2, 7, 12, 17, 22, ...} \).
Formulação recursiva
\[ f(1) = 2 f(n) = f(n - 1) + 5 \]
Implementação em JavaScript
const f = (n) => {
if (n == 1) {
return 2
} else {
return f(n - 1) + 5
}
}
Exemplo
N-ésimo termo da sequência \( {0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...} \).
Formulação recursiva
\[ fib(0) = 0 fib(1) = 1 fib(n) = fib(n - 1) + fib(n - 2) \]
Implementação em JavaScript
const fib = (n) => {
if (n == 0) {
return 0
} else if (n == 1) {
return 1
} else {
return fib(n - 1) + fib(n - 2)
}
}
Operação formada por uma repetição de operações mais primitivas
Exemplo
Implemente o operador de exponenciação para permitir calcular a potência natural de um número \( m \) qualquer: \( m^{n} \).
Formulação recursiva
\[ pot(m, 0) = 1 pot(m, n) = m \cdot pot(m, n - 1) \]
Exemplo
Implemente o operador de exponenciação para permitir calcular a potência inteira de um número \( m \) qualquer: \( m^{n} \).
Em alguns casos, é recomendado elaborarmos uma função auxiliar para ajudar.
const pot = (m, n) => {
// Neste caso, a função auxiliar é meio que a principal, já que a ela faz a
// multiplicação.
const potAux = (m, n) => {
if (n == 0) {
return 1
} else {
return m * potAux(m, n - 1)
}
}
// Em contraste, a tarefa da função principal é de cuidar dos expoentes
// negativos.
if (n < 0) {
return 1 / potAux(m, n * (-1))
} else {
return potAux(m, n)
}
}
Exemplo
Implemente o operador de divisão a fim de encontrar o resto da divisão entre dois números inteiros positivos fornecidos, \( n \) e \( m \).
Formulação recursiva
\[ resto(n, m) = n, \forall n < m resto(n, m) = resto(n - m, m), \forall n \geq m \]
Implementação em JavaScript
const resto = (n, m) => {
if (n < m) {
return n
} else {
return resto(n - m, m)
}
}