Ho un esercizio in Python come segue:
-
un polinomio è dato come una tupla di coefficienti tale che i poteri sono determinati dagli indici, ad esempio: (9,7,5) significa 9 + 7 * x + 5 * x ^ 2
-
scrive una funzione per calcolare il suo valore per x dato
Da quando sono in programmazione funzionale ultimamente, 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, quindi 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 (edit: I was wrong!) visto che usa molte moltiplicazioni invece dell'esponenziazione, in linea di principio, non mi importa delle misure qui (modifica: Quanto stupido da parte mia! Misurare avrebbe messo in evidenza il mio equivoco !) e ancora non è leggibile (probabilmente) come 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 leggibile quanto l'imperativo e vicino all'efficienza?
Certo, un cambio di rappresentazione sarebbe stato d'aiuto, ma questo è stato dato dall'esercizio.
Può essere anche Haskell o Lisp, non solo Python.