Ao implementar uma função recursiva que não possui uma condição de parada adequada, o que normalmente acontece na organização do computador?
Selecione uma opção:
◯ - sistema fecha automaticamente o programa
◯ Um registro da memória cache é sobrescrito
◯ Um fragmento de código é otimizado pelo compilador
◯ A memória RAM é liberada automaticamente
◯ Há um estouro de pilha (stack overflow) devido ao uso excessivo de memória da pilha de chamadas
◯ - sistema fecha automaticamente o programa
◯ Um registro da memória cache é sobrescrito
◯ Um fragmento de código é otimizado pelo compilador
◯ A memória RAM é liberada automaticamente
◯ Há um estouro de pilha (stack overflow) devido ao uso excessivo de memória da pilha de chamadas
Passo 1
O que o enunciado pede:
- Identificar o que normalmente acontece na organização do computador quando se implementa uma função recursiva que NÃO possui uma condição de parada adequada (isto é, quando a recursão é infinita ou cresce sem limite).
Informações e opções fornecidas:
- Opção A: sistema fecha automaticamente o programa
- Opção B: Um registro da memória cache é sobrescrito
- Opção C: Um fragmento de código é otimizado pelo compilador
- Opção D: A memória RAM é liberada automaticamente
- Opção E: Há um estouro de pilha (stack overflow) devido ao uso excessivo de memória da pilha de chamadas
Passo 2
Conceito básico e por que isso importa (explicação didática e sem pular etapas).
- O que é recursão: recursão é quando uma função chama a si mesma. Cada chamada cria um “quadro de ativação” (stack frame) na pilha de chamadas. Esse quadro guarda coisas como: endereço para retorno (onde continuar ao terminar), parâmetros da função, variáveis locais e espaço para o resultado.
- Por que precisa de condição de parada: uma recursão correta tem pelo menos um caso base (condição de parada) para que, em algum momento, as chamadas deixem de se encadear e comecem a retornar. Se esse caso base faltar ou nunca for atingido, a função continua chamando a si mesma indefinidamente.
- O que acontece a cada chamada: a cada novo chamado recursivo a pilha de chamadas aumenta — mais um quadro é empilhado. Esse crescimento consome memória reservada para a pilha do processo.
Passo 3
O limite de recursos e o fenômeno de erro que ocorre.
- A maioria dos sistemas opera com um limite finito para o tamanho da pilha de cada processo. Esse limite pode ser imposto pelo sistema operacional ou pela runtime (por exemplo, limites típicos de pilha são alguns megabytes por processo).
- Quando a recursão continua crescendo sem parar, a pilha vai crescendo até atingir esse limite.
- Quando o limite é ultrapassado ocorre um estouro de pilha (stack overflow). Em termos práticos, o processo não consegue alocar mais espaço para um novo quadro de ativação e a execução falha.
- Comportamento observável: dependendo da linguagem/ambiente, o programa pode lançar uma exceção/erro de stack overflow, ou o sistema operacional pode encerrar o processo (provendo um sinal de violação de memória ou similar). Mas a causa técnica é o estouro da pilha de chamadas.
Passo 4
Exemplo simples (para você enxergar passo a passo como isso acontece)
- Considere pseudocódigo sem condição de parada:
function recur():
recur() - Primeiro chamado: quadro A é empilhado.
- Dentro de A chama recur() de novo: quadro B é empilhado.
- Dentro de B chama recur(): quadro C é empilhado.
- E assim por diante até que a pilha atinja o limite → ocorre stack overflow.
- Analogia rápida: empilhar pratos sem parar até que a pilha caia — aqui “cair” é o erro/encerramento do processo.
Passo 5
Por que as outras opções estão erradas (resumo curto e claro)
- “sistema fecha automaticamente o programa”: pode ocorrer que o SO termine o processo quando há erro, mas isso é consequência do estouro de pilha; a afirmação isolada não descreve corretamente o mecanismo que ocorre na organização do computador.
- “Um registro da memória cache é sobrescrito”: cache/registradores não são tipicamente sobrescritos por recursão — o problema principal é o crescimento da pilha, não da cache.
- “Um fragmento de código é otimizado pelo compilador”: otimização do compilador não transforma recursão infinita em algo seguro; otimizações não resolvem falta de caso base.
- “A memória RAM é liberada automaticamente”: não é liberada por causa da recursão — na verdade, mais memória de pilha é consumida até o limite; liberação automática não acontece como consequência de recursão sem parada.
- A descrição que diz explicitamente “estouro de pilha (stack overflow) devido ao uso excessivo de memória da pilha de chamadas” corresponde exatamente ao fenômeno técnico que ocorre.
Passo 6
Encorajamento e dica prática para prova
- Quando ver uma função recursiva sem condição de parada ou com condição impossível de atingir, assuma que a pilha cresce indefinidamente e que o efeito será stack overflow.
- Boa forma de testar mentalmente: pergunte “essa chamada leva eventualmente ao caso base?” Se não levar, a resposta correta costuma ser o estouro da pilha.
Resposta
Há um estouro de pilha (stack overflow) devido ao uso excessivo de memória da pilha de chamadas