Sintetitza

Dissenya la versió recursiva de l’esquema de recorregut sintetitza.

Desa al mòdul esquemes la funció recursiva següent:

esquemes.sintetitza(acumula, seq, neutre)

Aplica la funció acumula als elements de la seqüència seq començant per neutre i el d’índex 0

Paràmetres:
  • acumula – funció amb dos paràmetres.

  • seq – seqüència amb els elements a acumular.

  • neutre – element neutre de l’operació acumula.

Retorna:

acumula(...acumula(acumula(neutre, seq[0]), seq[1])..., seq[-1])

Per exemple:


>>> s = [8, 3, 5, 2]
>>> sintetitza(operator.add, s, 0)
18
>>> sintetitza(max, s, s[0])
8
>>> sintetitza(operator.mul, s, 1)
240

Disposes de més jocs de proves al fitxer test-sintetitza.txt i d’una solució al fitxer esquemes.py.

Solucions

Recursiva lineal


def sintetitza_1(acumula, seq, neutre):
    if len(seq) == 0:
        r = neutre
    else:
        r_0 = sintetitza_1(acumula, seq[:-1], neutre)
        r = acumula(r_0, seq[-1])
    return r

Recursiva lineal amb immersió d’eficiència


def sintetitza_2(acumula, seq, neutre):
    return sintetitza_2_i(acumula, seq, neutre, range(len(seq)))

def sintetitza_2_i(acumula, seq, neutre, llesca):
    if len(llesca) == 0:
        r = neutre
    else:
        r_0 = sintetitza_2_i(acumula, seq, neutre, llesca[:-1])
        r = acumula(r_0, seq[llesca[-1]])
    return r