TIL(20220525) - 고계함수

jihunnit·2022년 6월 1일
0

학교 과제를 위해 clisp, python, javascript 를 이용해
고계함수 작성 관련 과제
내용은 vertor의 내적을 구하는 함수
innerProduct에 대한 구현
하지만 이제 map(혹은 mapcar)와 reduce를 곁들인
자세한 과제 내용은 생략
과제를 위해 공부했던 내용들에 대해 작성하겠음.

1. LISP(CLISP)

clisp에서의 구현은 mapcar와 reduce를 사용

(mapcar func list1 list2)
(reduce func list)

mapcar는 두 list에 대해 순차대로 순회하면서 func을 해 준다.
(list를 반환한다)
reduce는 한 list에 대해 계속 누적하며 진행하여 값 반환

2. Python

python에서는 구현에 map과 reduce를 사용한다
(reduce는 python 3에서는 따로 import 필요)

from functools import reduce

이 후 reduce와 map을 이용한다.
map은 요소들에 대해 함수를 적용하여 새로운 map을 반환한다.(원본의 변경이 아닌 새로운 맵의 생성, list 아님 주의)

#ex : list1의 모든 요소의 값을 1 증가시킨 map 생성
list1=[1,2,3,4,5]
result = list(map(lambda x:x+1, list1))
print(result) #[2,3,4,5,6]

reduce는 iterable 객체에 대해 function을 적용하여 누적한 값을 반환 초기값은 default=0
reduce(function, iterable, initializer=None)

#ex : list의 모든 요소를 더한 값 출력하기. 초기값 10.
from functools import reduce

list1=[1,2,3,4,5]
result = reduce(lambda x,y:x+y,list1,10)
print(result) #25

3.Javascript

내가 애정하는 자바스크립트의 경우에는 자바스크립트 array.prototype.map 을 이용하였고, reduce를 이용하였다.
map method는 map(function, index, array) 의 형태로 이용한다.

//모든 요소의 값을 2배한 배열 생성
let array1=[1,2,3,4,5];
let result = array1.map(x=>x*2);
console.log(result); //[2,4,6,8,10]

이렇게 기능적인 부분만 보고 생각을 해 보면, 뭔가 익숙한게 떠오르는 나같은 사람도 있을 것이다. forEach() 다. array.prototype.forEach()도 이거랑 똑같이 동작하는거 아냐?

하지만 매우 큰 차이점이 있다

forEach는 함수를 통해 원본 배열의 값을 변경하는데 반면에, map은 배열의 요소에 함수를 이용해 새로운 배열을 생성한다.

이 점을 유의하며 앞으로 어떤걸 쓸지 생각해보자.

reduce는 여기서도 마찬가지로 배열의 값을 누적하는 method이다.

//배열의 값에 대해 누적합.
array1=[1,2,3,4,5];
let sum = array1.reduce((arr,cur,i)=>{return arr+cur});
console.log(sum);//15

이상으로 함수형 프로그래밍 map(mapcar), reduce를 이용해 알아봤다.

지금 공개하는 이유 : 과제 제출 기한이 이제 지났기 때문 ㅎ

profile
인간은 노력하는 한 방황한다

0개의 댓글