카테고리 없음

GCD(최대공약수) 구하는 유클리드 알고리즘과 재귀함수, 단순 반복문 비교

explorer999 2024. 5. 24. 00:04

 

#유클리드 알고리즘 

 

:  주어진 두 수 사이에 존재하는 최대공약수(GCD-gratest common divisor)를 구하는 알고리즘이다.


두 자연수 a, b (a>b)에 대해서, 

  • a 를 b로 나눈 나머지가 0이라면 a와 b의 최대공약수는 b이다.
  • a 를 b로 나눈 나머지가 0이 아닌 자연수 r이라면, a와 b의 최대공약수는 b와 r의 최대공약수와 같다.
  • 다시 b와 r에 대한 최대공약수를 구하는 과정을 반복하기 위해서는 재귀함수를 사용해도 되고, 단순 반복문을 사용해도 된다. 

 

 

 

1. 재귀함수로 유클리드 알고리즘을 구현하기

def gcd_recursive(a, b):
    if b == 0:
        return a
    else:
        return gcd_recursive(b, a % b)

 

 

 

2. 반복문으로 유클리드 알고리즘을 구현하기

def gcd_iterative(a, b):
    while b != 0:
        a, b = b, a % b
    return a

 

 

 

이때, 재귀함수와 반복문의 장단점은 다음과 같이 정리할 수 있다.

 

재귀함수

 

장점:

  • 코드가 간결하고 직관적이다.
    • 복잡한 문제를 간결하고 이해하기 쉽게 표현할 수 있다.
    • 특히 트리나 그래프 탐색, 분할 정복 알고리즘 등에 유리하다.
    • 문제 자체가 재귀적인 경우, 재귀함수를 사용하면 문제의 구조를 그대로 코드에 반영할 수 있다.

단점:

  • 스택 오버플로우 발생 가능, 메모리를 많이 사용함
    • 재귀 깊이가 너무 깊어지면 스택 오버플로우(호출 스택의 한계를 초과하여 발생하는 오류)가 발생해서 프로그램이 작동하지 않을 수 있다.
    • 함수 호출마다 스택 프레임을 생성해서 반복문에 비해 성능이 떨어질 수 있다.

 

단순 반복문

 

장점:

  • 효율적이다.
    •  반복문은 일반적으로 재귀함수보다 메모리와 실행 시간이 효율적이다.
  • 안정적이다.
    •  스택 오버플로우의 위험이 없다.

단점:

  • 코드가 복잡하고 구현이 어렵다.
    • 재귀적인 문제를 반복문으로 푼다면 코드가 더 복잡해지고 가독성도 떨어질 수 있다.

 

 

따라서 재귀함수를 사용할지, 단순 반복문을 사용할지는 문제의 특성과 요구 사항에 따라 적절하게 선택해야 한다.