Mam ćwiczenie w języku Python w następujący sposób:
wielomian podano jako krotkę współczynników, tak że moce są określone przez indeksy, np .: (9,7,5) oznacza 9 + 7 * x + 5 * x ^ 2
napisz funkcję do obliczenia jej wartości dla danego x
Ponieważ ostatnio interesuję się programowaniem funkcjonalnym, napisałem
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)
które uważam za nieczytelne, więc napisałem
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]
co jest co najmniej tak samo nieczytelne, jak napisałem
def evaluate3(poly, x):
return poly[0]+x*evaluate(poly[1:],x) if len(poly)>0 else 0
co może być mniej wydajne (edytuj: pomyliłem się!), ponieważ wykorzystuje wiele mnożeń zamiast potęgowania, w zasadzie nie dbam o pomiary tutaj (edytuj: Jak głupio ze mnie! Mierzenie wskazałoby moje błędne przekonanie!) i wciąż nie jest tak czytelny (prawdopodobnie) jak iteracyjne rozwiązanie:
def evaluate4(poly, x):
result = 0
for i in range(0,len(poly)):
result += poly[i] * x**i
return result
Czy istnieje czysto funkcjonalne rozwiązanie tak czytelne, jak konieczne i bliskie wydajności?
Wprawdzie zmiana reprezentacji pomogłaby, ale dało to ćwiczenie.
Może to być również Haskell lub Lisp, nie tylko Python.
lambda
, w porównaniu do języków z lżejszą anonimową funkcją składni. Część tego prawdopodobnie przyczynia się do „nieczystego” wyglądu.
for
na przykład oznacza również nieużywanie pętli) jest złym celem w Pythonie. Ponowne wiązanie zmiennych rozsądnie i brak mutowania obiektów daje prawie wszystkie korzyści i sprawia, że kod jest nieskończenie bardziej czytelny. Ponieważ obiekty liczbowe są niezmienne i odsyła tylko dwie nazwy lokalne, twoje „imperatywne” rozwiązanie lepiej realizuje funkcjonalne zalety programowania niż jakikolwiek „ściśle czysty” kod Pythona.