다음과 같이 Python에서 운동을합니다.
다항식은 거듭 제곱이 지수에 의해 결정되도록 계수의 튜플로 제공됩니다. 예 : (9,7,5)는 9 + 7 * x + 5 * x ^ 2를 의미합니다.
주어진 x에 대한 값을 계산하는 함수를 작성
최근에 함수형 프로그래밍을하고 있었기 때문에
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)
읽을 수 없다고 생각해서
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]
적어도 읽을 수없는 것이므로
def evaluate3(poly, x):
return poly[0]+x*evaluate(poly[1:],x) if len(poly)>0 else 0
지수화 대신 많은 곱셈을 사용하기 때문에 효율성이 떨어질 수 있습니다 (편집 : 잘못되었습니다!) 여전히 반복 솔루션만큼 읽을 수는 없습니다 (논쟁 적으로).
def evaluate4(poly, x):
result = 0
for i in range(0,len(poly)):
result += poly[i] * x**i
return result
명령형으로 읽을 수 있고 효율성에 가까운 순수한 기능 솔루션이 있습니까?
분명히, 표현 변화가 도움이 될 것이지만, 이것은 운동에 의해 주어졌습니다.
Python뿐만 아니라 Haskell 또는 Lisp도 가능합니다.
lambda
더 가벼운 익명 구문 함수 를 사용 하는 언어와 비교 하여 파이썬을 사용하면 파이썬이 다소 추악 합니다. 그 중 일부는 아마도 "고약한"외모에 기여합니다.
for
예를 들어 루프를 사용하지 않음을 의미 ) 파이썬에서 목표로하는 나쁜 목표입니다. 변수를 신중하게 리 바인드 하고 객체 를 변경하지 않으면 거의 모든 이점을 얻을 수 있으며 코드를 더 읽기 쉽게 만듭니다. 숫자 객체는 변경할 수 없으며 두 개의 로컬 이름 만 리 바인드하기 때문에 "제국적인"솔루션은 "엄격히 순수한"파이썬 코드보다 기능적 프로그래밍 미덕을 더 잘 실현합니다.