1. Balla [4p]

Avís

Per a resoldre aquest exercici no es poden fer servir llistes, tuples, diccionaris ni cap altra estructura de dades per a desar tots els elements d’un iterador.

Definim el terme ballar sobre una llista d’enters L des d’una posició vàlida i com anar a la posició i+L[i].

Per exemple, donada la llista L = [3, 1, -2, -2] i una posició inicial 3:

  • de la 3 balla cap a la 1 (perquè 3+L[3] és 3-2 que és 1)

  • de la 1 balla cap a la 2

  • de la 2 balla cap a la 0

  • de la 0 balla cap a la 3 i entra en bucle infinit.

Si la llista fos L = [3, 1, -3, -2] i la posició inicial 3, el «ball» seria igual excepte que de la posició 3 ballaria cap a la -1 que considerem fora de rang i acaba. Igualment, si L = [4, 1, -2, -2] i posició inicial 3 de la 2 ballaria a la 0 i d’aquesta a la 4 que també és fora de rang.

Es demana que al mòdul balla (fitxer balla.py) facis funció generadora especificada a continuació:

balla.balla(L, i0)
Paràmetres:
  • L – llista no buida d” int

  • i0int

Retorna:

iterador sobre les posicions de L per les que es passa al anar ballant a partir de la posició i0 fins que surt de rang. Si no surt de rang la seqüència serà infinita (entra en bucle).

Per exemple:


>>> it = balla([3, 2, 3, -1, 7, -4], 0)
>>> next(it)
0
>>> next(it)
3
>>> next(it)
2
>>> next(it)
5

>>> it = balla([3, 2, 3, -1, 7, 1], 0)
>>> it == iter(it)
True
>>> list(it)
[0, 3, 2, 5]

Disposeu d’un joc de proves més complet en el fitxer tests-balla.txt