Questão nº 48
Questão de Tecnologia da Informação · FGV MP-SC 2022 (nº 48)
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:
- A`[0, 1, 1, 2, 2, 3]`
- B`[0, 1, 1, 2, 3, 5]` (alternativa correta)
- C`[0, 1, 2, 3, 4, 5]`
- D`[0, 1, 3, 5, 7, 9]`
- E`[1, 2, 3, 4, 5, 6]`
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 queself.a[-1] + self.a[-2]soma os dois últimos da lista antes de adicionar, mas o código adiciona corretamente; o erro seria se oiffosselen(self.a) > 2ou se houvesse umreturnantes do append. - (B) Correta: O gabarito oficial. Vejamos passo a passo:
__iter__definea = [0]. 1ºnext():len(a) == 1, entãoappend(1)→[0, 1]. 2ºnext():len(a) == 2, soma1+0=1→[0, 1, 1]. 3ºnext(): soma1+1=2→[0, 1, 1, 2]. 4ºnext(): soma2+1=3→[0, 1, 1, 2, 3]. 5ºnext(): soma3+2=5→[0, 1, 1, 2, 3, 5]. A quinta linha impressa (após 5 iterações dofor) é exatamente essa lista. - (C) Incorreta:
[0, 1, 2, 3, 4, 5]seria o resultado se o código adicionasseself.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 oself.a = [0]inicial e a lógica de soma dos dois anteriores. A pegadinha é achar que__iter__retornaself.ajá 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.