Questão nº 53

Questão de Tecnologia da Informação · CESGRANRIO BASA 01/2024 (nº 53)

CESGRANRIO2024Técnico Científico - Área de Formação: Tecnologia da InformaçãoTecnologia da Informação
Gabarito: Aver comentário ↓

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?

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 de item[1], e concat acrescenta esses elementos ao array resposta já existente, sem perder os indicados diretos já encontrados. É a única forma de acumular corretamente.
  • (B) Incorreta: resposta.concat(indicou(lista, item[1])); — O concat retorna um novo array, mas não modifica resposta. Como o resultado não é atribuído a nada, o retorno é descartado e a função continua com resposta vazio ou incompleto.
  • (C) Incorreta: resposta = indicou(lista, item[1]); — Isso sobrescreve o resposta atual 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 é que forEach espera uma função que receba (elemento, índice, array), mas resposta.push é passado sem bind. Dentro de push, o this não é resposta, então ele tenta empurrar para undefined ou gera erro. Além disso, mesmo que funcionasse, o forEach nã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.

Continue estudando

Estudar é izi

Pratique milhares de questões como esta, de graça, com explicação e gamificação no Quizinho.

Estudar de graça no Quizinho