Questão nº 38
Questão de Tecnologia da Informação · CESGRANRIO BASA 02/2021 (nº 38)
Em linguagens de programação como Java, onde existem estruturas de repetição, a recursão pode ser muitas vezes subs-
tituída pela repetição, com ganhos de desempenho.
Considere a seguinte função recursiva `segredo`, em Java:
```java
public static int segredo(int a) {
if (a<2) {
return 0;
} else {
return segredo(a-2)+1;
}
}
```
Que fragmento de código, em Java, contendo uma estrutura de repetição, é adequado para substituí-la?
- A
public static int alternativaA(int a) { int s = 0; for (int i=a;i>2;i--) { s++; } return s; } - B
public static int alternativaB(int a) { int s = 0; for (int i=a;i<2 && i>0;i--) { s++; } return s; } - C
(alternativa correta)public static int alternativaC(int a) { int s = 0; while (a>=2) { a-=2; s++; } return s; } - D
public static int alternativaD(int a) { int s = 0; do { a-=2; s++; } while (a>0 && a<=2); return s; } - E
public static int alternativaE(int a) { int s = 0; do { a-=2; s++; } while (a>0 && a<2); return s; }
Resposta comentada
Gabarito Alternativa C
Conceito-chave: A recursão segredo(a) conta quantas vezes dá para subtrair 2 de a até o valor ficar menor que 2. O loop equivalente precisa repetir exatamente essa mesma contagem, parando quando o valor atual for menor que 2.
- (A) Incorreta: O loop
for (int i=a; i>2; i--)conta deaaté 3, mas subtrai 1 a cada passo, não 2. Paraa=5, retorna 3, massegredo(5)retorna 2 (5→3→1). A condiçãoi>2também erra paraa=2, que deveria retornar 0, mas aqui retorna 0 por acaso, e paraa=3retorna 1, quando deveria retornar 0. - (B) Incorreta: A condição
i<2 && i>0faz o loop rodar apenas parai=1, mas o valor iniciali=anunca é menor que 2 sea≥2, então o loop nem executa. Paraa=1, executa uma vez e retorna 1, massegredo(1)retorna 0. A lógica de subtrair 1 (não 2) também está errada. - (C) Correta: O
while (a>=2)executa exatamente enquanto o valor atual deafor maior ou igual a 2, subtrai 2 e incrementas. Isso replica perfeitamente a recursão: paraa=5, faz 5→3→1, contando 2; paraa=2, faz 2→0, contando 1; paraa=1, não executa, retornando 0. É a tradução direta da recursão em cauda para um loop. - (D) Incorreta: O
do-whileexecuta pelo menos uma vez, mesmo paraa=0oua=1, subtraindo 2 e incrementandosindevidamente. A condiçãowhile (a>0 && a<=2)é contraditória e paraa=3, após uma iteraçãoa=1, a condiçãoa<=2é verdadeira, masa>0também, então executa de novo, subtraindo para-1, contando 2, quando o correto seria 1. - (E) Incorreta: O
do-whiletambém executa pelo menos uma vez, errando paraa=0ea=1. Paraa=3, após a primeira iteraçãoa=1, a condiçãoa>0 && a<2é verdadeira, então executa de novo, subtraindo para-1, contando 2, quando o correto seria 1. A condiçãoa<2deveria sera>=2para parar no momento certo.
Fonte: CESGRANRIO BASA 02/2021 Técnico Científico - Tecnologia da Informação. Reproduzida para fins de estudo.