exercism.org 에서 아래와 같이 코딩문제를 풀며 즐겁게 엘릭서를 공부하고있다.

문제를 풀다보면, 음 이렇게 푸는거보다 뭔가 세련된 방법이 있을 것 같은데... 하는 감이 온다.
예를들어 최대공약수 구하기 같은 함수를 만들려고 할때, 자바스크립트는 아래와 같다.
function gcd(a, b) {
// Using the Euclidean algorithm
while (b !== 0) {
let temp = b;
b = a % b;
a = temp;
}
return a;
}
그래서 엘릭서로 만들어야지 하고 아래와 같이 만들었다만;
# a,b 두수의 최대공약수 구하기
def gcd({a, b}) do
# 두 수중에 큰수를 골라야한다.
{big, small} = cond do
abs(a) > abs(b) -> {abs(a),abs(b)}
true -> {abs(b),abs(a)}
end
# 위의 자바스크립트 while 의 해당하는 표현식
# 충격적이게도 반복문 조건문으로 표현이 가능하다.
if small != 0 do
r = rem(big, small)
gcd({small, r})
else
big
end
end
그런데 문제는 a,b 값이 Integer 만 들어와야하는데, float 자료형의 2.0 같은 밸류도 되어야하지 않나...
수학에서 정수/실수냐의 구분과 컴퓨터 자료형의 구분( Integer/float)의 결이 다르기 때문이다.
이러면 수학에서 정수의 정의? 부터 구현해야하는데, 즉 입력값의 자료형이 무관하게 정수임을 만족하는지를 먼저 테스트해야한다.
뭔가 산으로가는 느낌이다.
어찌어찌 풀어냈다. 큰값을 골라야하는데, 음수의 경우 절대값을 써야하기 때문에 절대값을 구해야하고, 절대값을 구하고 gcd 값을 구하기위해선 나머지로 큰 수를 계속 나눠가야한다. 나누면, 무조건 float 자료형이다.
고수의 답변확인해보자.
def reduce(original={n, d}) do
case Integer.gcd(n,d) do
1 -> original
gcd -> {div(n, gcd), div(d, gcd)}
end
end
Integer.gcd/2 기본함수가 있었네;; 난 뭐했니..
:math.pow/2 (X) -> a**nInteger 모듈을 찾아보자. 객체.메소드(arg) 노테이션이라 주어(객체)-동사(메소드)-목적어(arg) 형태지만, 함수형에서는 리턴형모듈.함수명(arg...)이고, 주어에 해당하는 것도 arg에 넣을 뿐이다. abs/1)이 기본 암묵적으로 주어지는 Kernel모듈 안의 함수와 겹치는 경우가 있다. 이럴땐 명시적으로 Kernel.abs/1처럼 앞에 Kernel이라는 암묵적인 모듈명을 명시적으로 적어서 구분한다. 이런 짤막한 지식은 여기에 계속 업뎃해나가봐야겠다.