Seções 8.2–8.3 — Funções recursivas e validação de entrada
Uma função é recursiva quando ela chama a si mesma. Para evitar um loop infinito, toda função recursiva precisa de um caso base — uma condição que encerra a recursão sem fazer nova chamada.
O fatorial é o exemplo clássico: fat(n) = n × fat(n-1), e fat(1) = 1 (caso base).
Podemos adicionar um print para visualizar a pilha de chamadas:
Cada chamada fica “suspensa” esperando o resultado da próxima, formando uma pilha de chamadas. Quando o caso base é atingido, os retornos se propagam:
💡 Toda função recursiva precisa de: (1) um caso base que encerra a recursão e (2) uma chamada recursiva que aproxima o problema do caso base.
A sequência de Fibonacci é definida como: F(0) = 0, F(1) = 1 e F(n) = F(n-1) + F(n-2) para n ≥ 2. A sequência é: 0, 1, 1, 2, 3, 5, 8, 13, 21, …
Note que a recursão do Fibonacci faz duas chamadas recursivas, tornando o algoritmo exponencial. Para valores grandes de n, prefira a versão iterativa.
Escreva uma função recursiva mdc(a, b) que calcule o Máximo Divisor Comum usando o algoritmo de Euclides: mdc(a, b) = mdc(b, a % b), caso base: mdc(a, 0) = a.
Escreva uma função mmc(a, b) que calcule o Mínimo Múltiplo Comum usando a relação: mmc(a, b) = a * b // mdc(a, b).
Escreva uma função recursiva soma_digitos(n) que retorne a soma dos dígitos de um número inteiro positivo. Por exemplo: soma_digitos(1234) == 10.
Escreva uma função recursiva potencia(base, exp) que calcule base elevado a exp sem usar o operador **.
Programas robustos precisam validar os dados fornecidos pelo usuário. Sem funções, o código de validação fica repetido em vários lugares:
Com uma função de validação genérica, o código fica muito mais limpo:
💡 Funções de validação eliminam a duplicação de código e centralizam a lógica de verificação. Se a regra muda, basta alterar em um único lugar.
Crie uma função faixa_float(msg, minimo, maximo) similar a faixa_int, porém para números reais. Use-a para ler peso (30.0 a 300.0) e altura (0.5 a 2.5).
Crie uma função le_opcao(msg, opcoes) que exiba uma mensagem e aceite apenas uma das strings contidas na lista opcoes. Por exemplo: le_opcao("S ou N? ", ["S", "N"]).