Divideix, triplica

Partint d’un nombre natural, n, definim la sèrie matemàtica S(n) de la forma següent:

\[\begin{split}\begin{matrix} x_0 = n \\ x_{i} = \begin{cases} x_{i-1}/2 & \mbox{si } x_{i-1} \mbox{ es parell, }\\ 3x_{i-1}+1 & \mbox{si } x_{i-1} \mbox{ es senar } \end{cases} \mbox{ per } i > 0 \\ \end{matrix}\end{split}\]

Per exemple, S(120) és la successió

120, 60, 30, 15, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1

Fixeu-vos que els termes creixen i decreixen. Ningú no ho ha demostrat, però sembla ser que aquesta sèrie sempre convergeix a 1, independentment del nombre inicial n [1]. Entendrem per tant que és una successió finita de nombres naturals, el darrer terme de la qual és el 1.

Deseu al fitxer divtri.py les funcions següents:

  1. Dissenyeu la funció:

    successio(n)

    A partir d’un valor n positiu, genera un iterador sobre els nombres de la successió S(n) . Exemples:

    >>> it = successio(120)
    >>> next(it)
    120
    >>> next(it)
    60
    >>> next(it)
    30
    >>> for i in range(15):
    ...    a = next(it)
    >>> next(it)
    4
    >>> next(it)
    2
    >>> next(it)
    1
    

    Disposeu de més jocs de prova en el fitxer test-successio.txt.

  2. Dissenyeu la funció:

    maxmin(it)

    A partir d’un iterador finit com l’obtingut a la funció anterior, it, retorna una tupla amb el terme més gran i el terme més petit de it. Exemples:

    >>> it = iter([10, 5, 16, 8, 4, 2, 1])
    >>> maxmin(it)
    (16, 1)
    

    Disposeu de més jocs de prova en el fitxer test-maxmin.txt.

Disposeu d’una solució a divtri.py.