Eu tenho um exercício em Python da seguinte maneira:
um polinômio é dado como uma tupla de coeficientes, de modo que as potências sejam determinadas pelos índices, por exemplo: (9,7,5) significa 9 + 7 * x + 5 * x ^ 2
escreva uma função para calcular seu valor para x
Desde que eu estou na programação funcional ultimamente, escrevi
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 ilegível, então escrevi
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 é pelo menos tão ilegível, então eu escrevi
def evaluate3(poly, x):
return poly[0]+x*evaluate(poly[1:],x) if len(poly)>0 else 0
que pode ser menos eficiente (editar: eu estava errado!), pois usa muitas multiplicações em vez de exponenciação; em princípio, não me importo com medições aqui (editar: que bobagem minha! A medição teria apontado meu equívoco!) e ainda não é tão legível (sem dúvida) quanto a solução iterativa:
def evaluate4(poly, x):
result = 0
for i in range(0,len(poly)):
result += poly[i] * x**i
return result
Existe uma solução funcional pura tão legível quanto o imperativo e próxima a ela em eficiência?
É certo que uma mudança de representação ajudaria, mas isso foi dado pelo exercício.
Também pode ser Haskell ou Lisp, não apenas Python.
lambda
, comparado a idiomas com uma função de sintaxe anônima mais leve. Parte disso provavelmente contribui para a aparência "impura".
for
loops, por exemplo) é um objetivo ruim para o Python. Reconectar variáveis criteriosamente e não alterar objetos fornece quase todos os benefícios e torna o código infinitamente mais legível. Como os objetos numéricos são imutáveis e apenas religam dois nomes locais, sua solução "imperativa" realiza melhor as virtudes da programação funcional do que qualquer código Python "estritamente puro".