Alternativa D
A questão aborda o conceito de recursividade em programação, onde uma função chama a si mesma para resolver um problema menor até atingir uma condição de parada. Para que um método recursivo funcione corretamente, ele precisa obrigatoriamente de um caso base (condição de parada) e um passo recursivo que reduza o problema progressivamente.
Análise dos Fragmentos
Vamos analisar cada fragmento de código proposto para verificar se calcula a soma $1 + 2 + \dots + n$:
- I.
return n + sum(n - 1); - Este fragmento não possui nenhuma condição
if ou verificação de parada. - Ao chamar
sum(n), ele chama sum(n-1), que chama sum(n-2), e assim por diante indefinidamente. - Isso resulta em uma recursão infinita, causando um erro de estouro de pilha (StackOverflowError).
- Status: Incorreto.
- II.
if (n == 1) return 1; else return n + sum(n - 1); - Possui um caso base: quando
n == 1, retorna 1. Como a pré-condição diz n > 0, o menor valor possível é 1. - Possui um passo recursivo correto: reduz o valor de
n em 1 a cada chamada (n - 1), garantindo que eventualmente chegue ao caso base. - Exemplo para n=3:
3 + sum(2) \rightarrow 3 + (2 + sum(1)) \rightarrow 3 + 2 + 1 = 6. - Status: Correto.
- III.
if (n == 1) return 1; else return sum(n) + sum(n - 1); - Possui um caso base para
n == 1. - Porém, no passo recursivo (
else), ele chama sum(n) novamente dentro da própria expressão. - Isso cria uma recursão infinita com o mesmo valor de
n antes de reduzir para n - 1. - Exemplo para n=3:
sum(3) chama sum(3)... nunca avança para sum(2). - Status: Incorreto.
Conclusão
Apenas o fragmento II implementa corretamente a lógica de somatória recursiva, pois define claramente quando parar (quando n=1) e como reduzir o problema (chamando n-1). Os outros dois fragmentos falham ao não garantir a terminação do algoritmo.
Portanto, a alternativa correta é a d. Apenas II.