반응형
Unary function chainer
문제
단항 함수의 리스트 묶음의 체이닝을 위해서 higher order 함수를 작성해라.
나의 풀이
이 문제를 제대로 풀지 못하였고, 구글 검색을 통해서 방법을 찾아보았다.
내가 이 문제를 풀지 못한 이유는 고차함수에 대한 이해 부족 때문이다. 그래서 stackoverflow에 답을 찾아보기로 하였고, 그로 인한 나의 풀이는 아래와 같다.
xxxxxxxxxx
def chained(functions):
def apply(param):
result = param
for f in functions:
result = f(result)
return result
return apply
내가 최초에 잘 모르겠다고 생각한 부분은, 추가되는 함수 인자 부분을 어떻게 표현해야할지에 대해서 감이 오지 않았다. 예를들면, chained([f1, f2, f3])(1)
에서 (1)
의 경우 이다.
내가 검색해본 stackoverflow 답변에서는 아래와 같이 설명해준다.
1.위 문제와 같은 형태는 1개의 파라미터를 받아서 계산 후, 결과 값을 다시 파라미터로 넘기는 형태이다. 코드로 표현하면 아래와 같다.
x
def apply(param):
result = param
for f in functions:
result = f(result)
return result
2.chained([f1, f2, f3])(1)
을 다시 생각해보면, chained
가 return하는 함수에 다시 1
을 넘기는 형태니까, chanined
는 함수를 리턴해야하고(apply) 이 함수에 값은 param 을 통해서 받는 방법이다.
3.이렇게 되면, 일단 apply
가 리턴 될 것이고, 여기에 param
값으로 1이 넘어갈 것이고, apply
내부에서 최초 result 값이 1부터 계산 되어서 최종 값이 리턴되게 된다.
xxxxxxxxxx
def f1(x):
return x * 2
def f2(x):
return x + 2
def f3(x):
return x ** 2
def chained(functions):
def apply(param):
result = param
for f in functions:
result = f(result)
return result
return apply
if __name__ == "__main__":
print(chained([f1, f2, f3])(1))
xxxxxxxxxx
>> 16
다른 사람의 풀이
Best practice
xxxxxxxxxx
def chained(functions):
def f(x):
for function in functions:
x = function(x)
return x
return f
내가 참고한 풀이와 똑같이 풀었다.
회고
잘한 점
- 문제를 잘 풀지 못하여서 잘한 점은 딱히 없는 듯하다.
부족한 점
- 아직 함수형 프로그래밍에 익숙치 않아서, 어떻게 문제를 풀어야 할지 부터 감을 잘 못잡는 경향이 있다. 이 문제를 계기로 스텝바이스텝으로 공부해보도록 하자.
Action Item
- 고차함수에 대해서 이해하고 정리해보자
- 위와 비슷한 코드워즈 문제를 풀어보자
반응형
'개발 > CodeWars 문제 회고' 카테고리의 다른 글
[javascript] Generate range of integers (0) | 2021.01.04 |
---|---|
Buying a Car (0) | 2021.01.02 |
Regex Failure - Bug Fixing #2 (0) | 2020.12.20 |