더북(TheBook)

이해를 돕기 위해서 두 가지 예를 유클리드의 방식으로 풀어 보겠습니다. 하나는 60과 24의 최대공약수를 구하는 것이고, 다른 하나는 81과 27의 최대공약수를 구하는 것입니다.

 

gcd(60, 24) = gcd(24, 60 % 24) = gcd(24, 12) = gcd(12, 24 % 12) = gcd(12, 0) = 12

gcd(81, 27) = gcd(27, 81 % 27) = gcd(27, 0) = 27

 

신기하게도 최대공약수 문제가 몇 번만 계산했을 뿐인데 풀리는 것을 확인할 수 있습니다. 그런데 풀이 과정을 유심히 살펴보면 어떤 두 수의 최대공약수를 구하기 위해 다시 다른 두 수의 최대공약수를 구하고 있는 것을 알 수 있습니다. 이것이 바로 ‘재귀 호출’로 이 문제를 풀 수 있다는 힌트입니다.

이 문제는 a와 b의 최대공약수를 구하기 위해서 (a, b)보다 좀 더 작은 숫자인 (b, a % b)의 최대공약수를 구하는 과정을 이용하는 전형적인 재귀 호출 문제입니다(좀 더 작은 값으로 자기 자신을 호출합니다).

그렇다면 재귀 호출이 무한히 반복되지 않도록 하는 데 필요한 종료 조건은 무엇일까요? 바로 ‘어떤 수와 0의 최대공약수는 자기 자신’이라는 성질입니다. 이 성질이 종료 조건을 만들어 냅니다. 즉, b가 0이면 재귀 호출을 멈추고 결과를 돌려줍니다.

유클리드 알고리즘을 이용해 최대공약수를 구하는 프로그램을 만들면 다음과 같습니다.

 

 

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.