Filtra

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

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

esquemes.filtra(cond, seq)

Filtra els elements de seq que compleixen la condició cond.

Paràmetres:
  • funcio – funció amb un paràmetre.

  • seq – seqüència.

Tipus de retorn:

list

Retorna:

[e for e in seq if cond(e)]

Per exemple:


>>> s = [2, -1, -5, 7, -25]
>>> filtra(lambda x: x<0, s)
[-1, -5, -25]
>>> filtra(lambda x: x**2>10, s)
[-5, 7, -25]
>>> filtra(lambda x: x>0, s)
[2, 7]

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

Solucions

Recursiva lineal


def filtra_1(condicio, seq):
    if len(seq) == 0:
        r = []
    else:
        r = filtra_1(condicio, seq[1:])
        if condicio(seq[0]):
            r.insert(0, seq[0])
    return r

Recursiva lineal amb immersió d’eficiència


def filtra_2(condicio, seq):
    return filtra_2_i(condicio, seq, range(len(seq)))

def filtra_2_i(condicio, seq, llesca):
    if len(llesca) == 0:
        r = []
    else:
        r = filtra_2_i(condicio, seq, llesca[1:])
        if condicio(seq[llesca[0]]):
            r.insert(0, seq[llesca[0]])
    return r