Questão nº 53
Questão de Tecnologia da Informação · CESGRANRIO BASA 01/2024 (nº 53)
Um banco comercial possui em sua base de dados uma tabela que informa o cliente que indicou diretamente outro cliente, identificando, de forma correlata, o cliente indicador e o cliente indicado. Essa tabela contém duas colunas, cpfIndicador e cpfIndicado, que contêm, respectivamente, o CPF de quem indicou e o CPF de quem foi indicado. Considerando essa tabela, o departamento de marketing imaginou uma promoção em que o número de pontos que cada cliente faria seria igual ao número de clientes que ele trouxesse ao banco, considerando também, como indicados pelo cliente original, de forma recursiva, todos os clientes indicados por clientes que ele indicou, sucessivamente. Foi solicitado ao setor de TI que gerasse um código JavaScript para implementar essa promoção.
Nesse contexto, considere o código JavaScript incompleto a seguir, do qual uma linha foi removida intencionalmente, na posição indicada com o comentário <<LINHA DE CODIGO>>.
function indicou(lista, indicador) {
let resposta = [];
for (let i = 0; i < lista.length; i++) {
let item = lista[i];
if (item[0] === indicador) {
if (!resposta.includes(item[1])) {
//<< LINHA DE CODIGO >>
resposta.push(item[1]);
}
}
}
return resposta;
}
Que linha de código JavaScript pode ser escrita na posição de <<LINHA DE CODIGO>> para garantir uma implementação correta e recursiva?
- A`resposta = resposta.concat(indicou(lista, item[1]));` (alternativa correta)
- B`resposta.concat(indicou(lista, item[1]));`
- C`resposta = indicou(lista, item[1]);`
- D`resposta.push(item[0]);`
- E`indicou(lista, item[1]).forEach(resposta.push);`
Resposta comentada
Gabarito Alternativa A
Conceito-chave: A recursão exige que o resultado da chamada interna seja acumulado com o resultado atual. Se você não usar concat (que junta arrays) ou um push individual, a cada passo você sobrescreve ou perde os dados já coletados.
- (A) Correta:
resposta = resposta.concat(indicou(lista, item[1]));— Aqui, a chamada recursiva retorna um array com todos os indicados indiretos deitem[1], econcatacrescenta esses elementos ao arrayrespostajá existente, sem perder os indicados diretos já encontrados. É a única forma de acumular corretamente. - (B) Incorreta:
resposta.concat(indicou(lista, item[1]));— Oconcatretorna um novo array, mas não modificaresposta. Como o resultado não é atribuído a nada, o retorno é descartado e a função continua comrespostavazio ou incompleto. - (C) Incorreta:
resposta = indicou(lista, item[1]);— Isso sobrescreve orespostaatual com o resultado da chamada recursiva, perdendo todos os indicados diretos que já foram adicionados no loop anterior. O array final ficaria apenas com o último ramo explorado. - (D) Incorreta:
resposta.push(item[0]);—item[0]é o indicador (o CPF que indicou), não o indicado. Isso adicionaria o próprio indicador à lista de resposta, o que é logicamente errado e não faz recursão. - (E) Incorreta:
indicou(lista, item[1]).forEach(resposta.push);— A armadilha aqui é queforEachespera uma função que receba (elemento, índice, array), masresposta.pushé passado sem bind. Dentro depush, othisnão éresposta, então ele tenta empurrar paraundefinedou gera erro. Além disso, mesmo que funcionasse, oforEachnão acumula o retorno, e a ordem de execução poderia duplicar ou pular itens.
Fonte: CESGRANRIO BASA 01/2024 Técnico Científico - Área de Formação: Tecnologia da Informação (Caderno Prova B). Reproduzida para fins de estudo.