Questão nº 34
Questão de Tecnologia da Informação · FCC SEGEP-MA 2018 (nº 34)
FCC2018Analista Executivo - Programador de SistemasTecnologia da Informação
Gabarito: Aver comentário ↓
Considere o programa Java abaixo.
public class Ordem {
public static void ordena(int[] A, int n) {
if (n == 1) {
return;
}
int m = n - 1;
for (int i = 0; i < n - 1; i++) {
if (A[i] > A[m]) {
m = i;
}
}
int t = A[m];
A[m] = A[n - 1];
A[n - 1] = t;
I
}
public static void main(String[] args) {
int[] X = {10, 15, 11, 4, 2, 7};
ordena(X, X.length);
for (int i = 0; i < X.length; i++) {
System.out.print(X[i] + " ");
}
}
}
Para que os valores contidos no vetor X sejam apresentados em ordem crescente, a lacuna I deve ser preenchida por
- A`ordena(A, n - 1);` (alternativa correta)
- B`A[m + 1] = A[n - 1];`
- C`ordena(A, n);`
- D`t = A[maior - 1];`
- E`ordena(A, n + 1);`
Resposta comentada
Gabarito Alternativa A
A recursão é uma técnica de programação onde uma função resolve um problema chamando a si mesma para resolver uma versão menor do mesmo problema, até atingir um caso base que pode ser resolvido diretamente.
- (A) Correta: A função
ordenaencontra o maior elemento no sub-vetorA[0...n-1]e o coloca na posiçãoA[n-1]. Para ordenar o restante do vetor, é necessário chamar a função novamente para o sub-vetorA[0...n-2], o que é feito comordena(A, n - 1). Isso reduz o problema em uma unidade a cada chamada, caminhando em direção ao caso basen == 1. - (B) Incorreta: Esta é uma atribuição de valor, não uma chamada recursiva. Ela não continua o processo de ordenação e pode causar erros lógicos ou de índice.
- (C) Incorreta: Chamar
ordena(A, n)novamente com o mesmo valor denresultaria em uma recursão infinita. A função nunca alcançaria o caso basen == 1(a menos quenjá fosse 1), fazendo com que o programa travasse ou estourasse a pilha de chamadas (StackOverflowError). Esta é uma armadilha comum para iniciantes em recursão. - (D) Incorreta: A variável
maiornão está definida no escopo do método, causando um erro de compilação. Além disso, é uma atribuição e não uma chamada recursiva. - (E) Incorreta: Chamar
ordena(A, n + 1)aumentaria o tamanho do problema em vez de diminuí-lo, afastando-se do caso base e potencialmente causando umArrayIndexOutOfBoundsExceptionsen + 1exceder o tamanho real do vetor.
Fonte: FCC SEGEP-MA 2018 Analista Executivo - Programador de Sistemas (Caderno Tipo 1). Reproduzida para fins de estudo.