14 outubro, 2021

Selo DC

Introdução

  • Recursão: refere-se a capacidade que uma função tem de chamar a si própria, no corpo de sua própria função
  • Evita loops
  • Torna o código mais curto e limpo;
  • Solução simples para alguns problemas;
  • Entretanto, pode ser mais complexo o entendimento!

Exemplo do fatorial

\[ 5! = 5 \times 4 \times 3 \times 2 \times 1 = 120 \] \[ 1! = 0! = 1 \] Na prática: \(f(n) = n \times (n - 1) \times (n - 2) ...\)

Implementando essa função em R

  • No R já existe factorial()!
  • De forma didática temos duas implementações:
fatorial1 <- function(n) {
  if (!is.numeric(n)) stop("n deve ser numérico!", call. = FALSE)
  if (n == 0 || n == 1) return(1)
  prod(1:n)
}

fatorial2 <- function(n) {
  if (!is.numeric(n)) stop("n deve ser numérico!", call. = FALSE)
  if (n == 0 || n == 1) return(1)
  # Usando o loop
  aux <- 1
  for(i in 2:n) {
    aux <- i * aux
  } 
  return(aux)
}

Executando as funções criadas

factorial(5)
## [1] 120
fatorial1(5)
## [1] 120
fatorial2(5)
## [1] 120

Implementando agora de forma recursiva

Exemplo anterior: \[ \begin{align*} 5! & = 5 & \times & 4 & \times & 3 & \times & 2 & \times & 1\\ f(n) & = n & \times & n - 1 & \times & (n - 1) - 1 & \times & (n - 2) - 1 & \times & (n - 3) - 1\\ \end{align*} \] Em R:

fatorial3 <- function(n) {
  if (!is.numeric(n)) stop("n deve ser numérico!", call. = FALSE)
  if (n == 0 || n == 1) return(1)
  return(n * fatorial3(n - 1))
}

Entendo o código para \(5!\)

# Chamando fatorial3(5)
fatorial3(5)
# O que ocorre nos bastidores do R
fatorial3(5)
   |
   --> 5 * fatorial3(4)
              |
              --> 4 * fatorial3(3)
                         |
                         --> 3 * fatorial3(2)
                                    |
                                    --> 2 * fatorial3(1)
                                               |
                                               --> 1 * return(1) # Importantíssimo!
                                                         |
                                                         --> fechamento de fatorial3()
fatorial3(5)
## [1] 120

Bons estudos!