Saya memiliki latihan dengan Python sebagai berikut:
polinomial diberikan sebagai tupel koefisien sehingga kekuatan ditentukan oleh indeks, misalnya: (9,7,5) berarti 9 + 7 * x + 5 * x ^ 2
tulis fungsi untuk menghitung nilainya untuk diberikan x
Karena saya ke pemrograman fungsional belakangan ini, saya menulis
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)
yang saya anggap tidak terbaca, jadi saya menulis
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]
yang setidaknya sama tidak terbaca, jadi saya menulis
def evaluate3(poly, x):
return poly[0]+x*evaluate(poly[1:],x) if len(poly)>0 else 0
yang mungkin kurang efisien (sunting: saya salah!) karena menggunakan banyak perkalian alih-alih eksponensial, pada prinsipnya, saya tidak peduli tentang pengukuran di sini (sunting: Betapa bodohnya saya! Mengukur akan menunjukkan kesalahpahaman saya!) dan masih belum terbaca (bisa dibilang) sebagai solusi berulang:
def evaluate4(poly, x):
result = 0
for i in range(0,len(poly)):
result += poly[i] * x**i
return result
Apakah ada solusi murni fungsional yang dapat dibaca seperti keharusan dan mendekati efisiensi?
Memang, perubahan representasi akan membantu, tetapi ini diberikan oleh latihan.
Bisa juga Haskell atau Lisp, bukan hanya Python.
lambda
, dibandingkan dengan bahasa dengan fungsi sintaksis anonim yang lebih ringan. Sebagian dari itu mungkin berkontribusi pada penampilan "najis".
for
loop, misalnya) adalah tujuan yang buruk untuk dibidik dengan Python. Mengikat variabel secara bijaksana dan tidak memutasikan objek memberi Anda hampir semua manfaat dan membuat kode jauh lebih mudah dibaca. Karena objek nomor tidak dapat diubah dan hanya mengubah dua nama lokal, solusi "imperatif" Anda lebih menyadari nilai pemrograman fungsional daripada kode Python "murni murni" apa pun.