Módulo 1 · Lógica e demonstrações

Indução matemática e recursão

Aula 1.2 · cerca de 20 minutos

Indução é a versão matemática da recursão. Para provar que P(n) vale para todo n ≥ 0, você prova duas coisas:

1. Caso base:   P(0)
2. Passo:       P(k) → P(k+1), para todo k ≥ 0

É exatamente como uma função recursiva correta: o caso base termina e o passo reduz o problema para um caso menor que já “funciona”.

Exemplo: soma dos n primeiros naturais

1 + 2 + … + n = n(n+1) / 2

Base: para n = 1, os dois lados valem 1. Passo: suponha que vale para k. Então 1 + … + k + (k+1) = k(k+1)/2 + (k+1) = (k+1)(k+2)/2, que é a fórmula para k+1. ∎

def soma(n):
    if n == 0:          # caso base
        return 0
    return soma(n - 1) + n   # passo: confia em soma(n-1)

assert all(soma(n) == n * (n + 1) // 2 for n in range(500))
Dica: Um assert sobre 500 casos não é prova, mas é uma ótima forma de achar o erro antes de tentar provar. Testes baseados em propriedades (Hypothesis, fast-check) generalizam essa ideia.

Indução forte

Na indução forte, o passo pode usar P(0), P(1), …, P(k), e não só P(k). É a forma natural para algoritmos de divisão e conquista, como o merge sort, que recursa em metades e não em n − 1.

Exercício 1

Prove por indução que 2⁰ + 2¹ + … + 2ⁿ = 2ⁿ⁺¹ − 1.

Exercício 2

Onde está o erro? “Todos os cavalos têm a mesma cor: num grupo de k+1 cavalos, tire um; os k restantes têm a mesma cor. Recoloque-o e tire outro; de novo, mesma cor. Logo todos os k+1 têm a mesma cor.”