Tôi có một bài tập về Python như sau:
một đa thức được đưa ra dưới dạng một bộ các hệ số sao cho các lũy thừa được xác định bởi các chỉ số, ví dụ: (9,7,5) có nghĩa là 9 + 7 * x + 5 * x ^ 2
viết hàm để tính giá trị của nó cho x đã cho
Vì tôi tham gia lập trình chức năng gần đây, tôi đã viết
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)
mà tôi cho là không thể đọc được, vì vậy tôi đã viết
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]
mà ít nhất là không thể đọc được, vì vậy tôi đã viết
def evaluate3(poly, x):
return poly[0]+x*evaluate(poly[1:],x) if len(poly)>0 else 0
Điều này có thể kém hiệu quả hơn (chỉnh sửa: Tôi đã sai!) vì nó sử dụng nhiều phép nhân thay vì lũy thừa, về nguyên tắc, tôi không quan tâm đến các phép đo ở đây (chỉnh sửa: Tôi thật ngớ ngẩn! vẫn không thể đọc được (có thể tranh luận) như giải pháp lặp:
def evaluate4(poly, x):
result = 0
for i in range(0,len(poly)):
result += poly[i] * x**i
return result
Có một giải pháp chức năng thuần túy có thể đọc được như là bắt buộc và gần với nó trong hiệu quả?
Phải thừa nhận rằng, một sự thay đổi đại diện sẽ giúp ích, nhưng điều này được đưa ra bởi bài tập.
Có thể là Haskell hoặc Lisp, không chỉ Python.
lambda
, so với các ngôn ngữ có chức năng cú pháp ẩn danh nhẹ hơn. Một phần trong đó có thể góp phần vào sự xuất hiện "ô uế".
for
các vòng lặp chẳng hạn) là một mục tiêu xấu để nhắm đến trong Python. Liên kết lại các biến một cách thận trọng và không làm biến đổi các đối tượng mang lại cho bạn gần như tất cả các lợi ích và làm cho mã dễ đọc hơn nhiều. Vì các đối tượng số là bất biến và nó chỉ phản hồi hai tên cục bộ, nên giải pháp "bắt buộc" của bạn nhận ra các đức tính lập trình chức năng tốt hơn bất kỳ mã Python "hoàn toàn thuần túy" nào.