Tengo un ejercicio en Python de la siguiente manera:
un polinomio se da como una tupla de coeficientes de modo que las potencias están determinadas por los índices, por ejemplo: (9,7,5) significa 9 + 7 * x + 5 * x ^ 2
escribir una función para calcular su valor para x dado
Como estoy en la programación funcional últimamente, escribí
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)
que considero ilegible, así que escribí
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]
que es al menos tan ilegible, así que escribí
def evaluate3(poly, x):
return poly[0]+x*evaluate(poly[1:],x) if len(poly)>0 else 0
que podría ser menos eficiente (editar: ¡me equivoqué!) ya que usa muchas multiplicaciones en lugar de exponenciación, en principio, no me importan las mediciones aquí (editar: ¡Qué tonto de mi parte! ¡La medición habría señalado mi error!) y todavía no es tan legible (posiblemente) como la solución iterativa:
def evaluate4(poly, x):
result = 0
for i in range(0,len(poly)):
result += poly[i] * x**i
return result
¿Existe una solución puramente funcional tan legible como la imperativa y cercana a la eficiencia?
Es cierto que un cambio de representación ayudaría, pero esto fue dado por el ejercicio.
También puede ser Haskell o Lisp, no solo Python.
lambda
, en comparación con los idiomas con una función de sintaxis anónima más ligera. Parte de eso probablemente contribuye a la apariencia "inmunda".
for
bucles, por ejemplo) es un mal objetivo al que apuntar en Python. Volver a vincular variables juiciosamente y no mutar objetos le brinda casi todos los beneficios y hace que el código sea infinitamente más legible. Como los objetos numéricos son inmutables y solo vuelven a unir dos nombres locales, su solución "imperativa" se da cuenta mejor de las virtudes de programación funcional que cualquier código Python "estrictamente puro".