Computação Múltipla Escolha

Considere o seguinte método sum() 1 // Pré-condição: n > 0. 2 // Pós-condição: 1 + 2 + ... + n é devolvido. 3 4 public int sum(int n) 5 { 6 <corpo> 7 } Quais dos seguintes fragmentos, quando usados como <corpo> desse método, permitiria o cálculo correto de 1 + 2 + ... + n para n > 0?

Considere o seguinte método sum()

1 // Pré-condição: n > 0.
2 // Pós-condição: 1 + 2 + ... + n é devolvido.
3
4 public int sum(int n)
5 {
6 <corpo>
7 }

Quais dos seguintes fragmentos, quando usados como <corpo> desse método, permitiria o cálculo correto de 1 + 2 + ... + n para n > 0?

  1. Todos
  2. Apenas III
  3. Apenas I e II
  4. Apenas II
  5. Apenas I

Resolução completa

Explicação passo a passo

D
Alternativa D

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.

Tem outra questão para resolver?

Resolver agora com IA

Mais questões de Computação

Ver mais Computação resolvidas

Tem outra questão de Computação?

Cole o enunciado, tire uma foto ou descreva o problema — a IA resolve com explicação completa em segundos.