Questão nº 48

Questão de Tecnologia da Informação · FGV MP-SC 2022 (nº 48)

FGV2022Analista em Tecnologia da InformaçãoTecnologia da Informação
Gabarito: Bver comentário ↓

Analise o código Python a seguir.

class xptoClass:
  def __iter__(self):
    self.a = [0]
    return self
  def __next__(self):
    self.a.append( \
        self.a[-1] \
        + self.a[-2] if len(self.a) > 1 else 1)
    return self.a
xpto = xptoClass()
xptoIter = iter(xpto)
for k in range(1,6):
print(next(xptoIter))

No resultado produzido pela execução do código acima, a quinta linha contém exatamente:

Resposta comentada

Gabarito Alternativa B

Conceito-chave: O __next__ retorna a lista inteira self.a a cada chamada, e não apenas o novo número. O iter() chama __iter__ uma vez, que inicializa self.a = [0]; depois, cada next() chama __next__, que adiciona um elemento à lista e devolve a lista atualizada. A sequência gerada é a de Fibonacci (cada termo é a soma dos dois anteriores), mas o primeiro next() já adiciona o segundo elemento (1), então a lista cresce de 1 elemento por chamada.

  • (A) Incorreta: A lista [0, 1, 1, 2, 2, 3] quebraria a lógica de Fibonacci no 5º termo (deveria ser 3, não 2). A pegadinha aqui é achar que self.a[-1] + self.a[-2] soma os dois últimos da lista antes de adicionar, mas o código adiciona corretamente; o erro seria se o if fosse len(self.a) > 2 ou se houvesse um return antes do append.
  • (B) Correta: O gabarito oficial. Vejamos passo a passo: __iter__ define a = [0]. 1º next(): len(a) == 1, então append(1)[0, 1]. 2º next(): len(a) == 2, soma 1+0=1[0, 1, 1]. 3º next(): soma 1+1=2[0, 1, 1, 2]. 4º next(): soma 2+1=3[0, 1, 1, 2, 3]. 5º next(): soma 3+2=5[0, 1, 1, 2, 3, 5]. A quinta linha impressa (após 5 iterações do for) é exatamente essa lista.
  • (C) Incorreta: [0, 1, 2, 3, 4, 5] seria o resultado se o código adicionasse self.a[-1] + 1 (incremento simples), mas a operação é a soma dos dois últimos elementos, não um incremento fixo. A armadilha aqui é confundir a sequência de Fibonacci com uma progressão aritmética.
  • (D) Incorreta: [0, 1, 3, 5, 7, 9] sugere que o código soma o último elemento com o primeiro (a[0]), ou que há um erro de índice. Na verdade, self.a[-2] é o penúltimo, não o primeiro; a sequência correta é Fibonacci, não números ímpares.
  • (E) Incorreta: [1, 2, 3, 4, 5, 6] ignora completamente o self.a = [0] inicial e a lógica de soma dos dois anteriores. A pegadinha é achar que __iter__ retorna self.a já com [0] e que __next__ retorna apenas o novo termo, mas o código retorna a lista inteira, e o primeiro elemento é sempre 0.

Fonte: FGV MP-SC 2022 Analista em Tecnologia da Informação (Caderno Tipo 1). 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