Capítulo 17: Recursividade 🌀🛌

Neste capítulo, vamos aprender sobre Recursividade, que é quando uma função chama a ela mesma, com o tema do filme Inception (A Origem)!


📖 O que é Recursividade?

Uma função recursiva é aquela que resolve um problema chamando a si mesma com uma versão menor do mesmo problema. É como entrar em um sonho dentro de outro sonho!

Para não ficarmos presos no sonho para sempre (loop infinito), toda função recursiva precisa de uma Condição de Parada (o “chute” para acordar).


📖 Exemplo Guiado: Contagem Regressiva para Acordar

Vamos criar uma função que faz uma contagem regressiva para o personagem acordar das camadas de sonho.

  1. Crie o arquivo inception.go na pasta src/:
package main
 
import "fmt"
 
func aprofundarSonho(camada int) {
    if camada == 0 {
        fmt.Println("BUM! Chegamos ao limbo. Hora de acordar!")
        return // Condição de parada!
    }
 
    fmt.Println("Entrando na camada de sonho:", camada)
    
    // A função chama a si mesma passando um valor menor!
    aprofundarSonho(camada - 1)
    
    fmt.Println("Acordando e voltando da camada:", camada)
}
 
func main() {
    fmt.Println("Iniciando a missao...")
    aprofundarSonho(3)
    fmt.Println("Missao concluida. Todos acordados!")
}

🕹️ Como Executar e Testar no VS Code

  1. Abra o terminal integrado.
  2. Execute: go run inception.go

Resultado Esperado:

Iniciando a missao...
Entrando na camada de sonho: 3
Entrando na camada de sonho: 2
Entrando na camada de sonho: 1
BUM! Chegamos ao limbo. Hora de acordar!
Acordando e voltando da camada: 1
Acordando e voltando da camada: 2
Acordando e voltando da camada: 3
Missao concluida. Todos acordados!

📊 Ilustração Visual: Pilha de Chamadas

Veja como as funções se empilham e depois voltam:

graph TD
    A["1. aprofundarSonho(3)"] --> B["2. aprofundarSonho(2)"]
    B --> C["3. aprofundarSonho(1)"]
    C --> D["4. Limbo (Parada)"]
    D --> C
    C --> B
    B --> A

🛠️ Prática Obrigatória 1: Fatorial (Multiplicação em Cadeia)

Crie uma função recursiva chamada fatorial(n int) int. O fatorial de um número é ele multiplicado pelos seus antecessores (ex: fatorial(3) é 3 * 2 * 1 = 6). A condição de parada é quando n == 1 (retorna 1). Teste na main calculando o fatorial de 5!


🔑 Gabarito de Código

Prática 1: fatorial.go

package main
 
import "fmt"
 
func fatorial(n int) int {
    if n == 1 {
        return 1 // Parada
    }
    // Chama a si mesma multiplicando
    return n * fatorial(n-1)
}
 
func main() {
    numero := 5
    resultado := fatorial(numero)
    fmt.Println("O fatorial de", numero, "e:", resultado)
}

Capitulo Anterior | Proximo Capitulo