J'ai un exercice en Python comme suit:
un polynôme est donné comme un tuple de coefficients tels que les puissances sont déterminées par les indices, par exemple: (9,7,5) signifie 9 + 7 * x + 5 * x ^ 2
écrire une fonction pour calculer sa valeur pour x donné
Depuis que je suis dans la programmation fonctionnelle ces derniers temps, j'ai écrit
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 je juge illisible, alors j'ai écrit
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]
ce qui est au moins aussi illisible, alors j'ai écrit
def evaluate3(poly, x):
return poly[0]+x*evaluate(poly[1:],x) if len(poly)>0 else 0
ce qui pourrait être moins efficace (éditer: j'avais tort!) car il utilise de nombreuses multiplications au lieu d'exponentiation, en principe, je ne me soucie pas des mesures ici (éditer: comme c'est idiot de ma part! toujours pas aussi lisible (sans doute) que la solution itérative:
def evaluate4(poly, x):
result = 0
for i in range(0,len(poly)):
result += poly[i] * x**i
return result
Existe-t-il une solution purement fonctionnelle aussi lisible que l'impératif et proche de son efficacité?
Certes, un changement de représentation aiderait, mais cela a été donné par l'exercice.
Peut être Haskell ou Lisp, pas seulement Python.
lambda
, par rapport aux langages avec une fonction de syntaxe anonyme plus légère. Une partie de cela contribue probablement à l'apparence «impure».
for
boucles, par exemple) est un mauvais objectif à viser en Python. Re-lier judicieusement les variables et ne pas muter les objets vous donne presque tous les avantages et rend le code infiniment plus lisible. Étant donné que les objets numériques sont immuables et ne relient que deux noms locaux, votre solution "impérative" réalise mieux les vertus de programmation fonctionnelle que tout code Python "strictement pur".