Ho un esercizio in Python come segue:
un polinomio è dato come una tupla di coefficienti in modo tale che i poteri siano determinati dagli indici, ad esempio: (9,7,5) significa 9 + 7 * x + 5 * x ^ 2
scrivere una funzione per calcolare il suo valore per x dato
Dato che ultimamente mi occupo di programmazione funzionale, ho scritto
def evaluate1(poly, x):
coeff = 0
power = 1
return reduce(lambda accu,pair : accu + pair[coeff] * x**pair[power],
map(lambda x,y:(x,y), poly, range(len(poly))),
0)
che ritengo illeggibile, così ho scritto
def evaluate2(poly, x):
power = 0
result = 1
return reduce(lambda accu,coeff : (accu[power]+1, accu[result] + coeff * x**accu[power]),
poly,
(0,0)
)[result]
che è almeno illeggibile, così ho scritto
def evaluate3(poly, x):
return poly[0]+x*evaluate(poly[1:],x) if len(poly)>0 else 0
che potrebbe essere meno efficiente (modifica: ho sbagliato!) dal momento che utilizza molte moltiplicazioni anziché esponenziazione, in linea di principio, non mi interessa le misurazioni qui (modifica: quanto sono sciocco! Misurare avrebbe sottolineato il mio malinteso!) e non è ancora leggibile (probabilmente) come la soluzione iterativa:
def evaluate4(poly, x):
result = 0
for i in range(0,len(poly)):
result += poly[i] * x**i
return result
Esiste una soluzione puramente funzionale tanto leggibile quanto l'imperativo e vicina ad essa in termini di efficienza?
Certo, un cambio di rappresentazione sarebbe di aiuto, ma questo è stato dato dall'esercizio.
Può essere anche Haskell o Lisp, non solo Python.
lambda
, rispetto alle lingue con una funzione di sintassi anonima più leggera. Parte di ciò probabilmente contribuisce all'apparenza "sporca".
for
loop, per esempio) è un cattivo obiettivo a cui puntare in Python. Riassegnare le variabili in modo giudizioso e non mutare gli oggetti offre quasi tutti i vantaggi e rende il codice infinitamente più leggibile. Poiché gli oggetti numerici sono immutabili e si limitano a ricollegare solo due nomi locali, la soluzione "imperativa" realizza meglio le virtù di programmazione funzionale rispetto a qualsiasi codice Python "rigorosamente puro".