이론/알고리즘

[JAVA] 재귀함수와 반복문의 차이

블스뜸 2025. 4. 23. 15:34

재귀 함수와 반복문은 특정 작업을 반복적으로 수행하는 두 가지 기본적인 프로그래밍 기법.
둘 다 유사한 결과를 얻을 수 있지만, 작동 방식과 그에 따른 장단점, 그리고 주로 사용되는 상황이 다르다.

재귀 함수 (Recursive Function)

재귀 함수는 함수 내부에서 자기 자신을 다시 호출하는 함수.
이 호출은 특정 종료 조건에 도달할 때까지 계속된다.

  • 작동 방식: 함수가 호출될 때마다 새로운 스택 프레임이 생성되어 함수의 지역 변수와 호출 정보가 저장됩니다. 자기 호출이 반복되면서 스택이 계속 쌓이다가, 종료 조건이 만족되면 함수 호출이 역순으로 종료되면서 결과가 반환된다.
  • 장점:
    • 코드의 간결성 및 가독성: 복잡한 문제를 더 작고 관리하기 쉬운 하위 문제로 분할하여 해결하므로, 코드가 더 직관적이고 이해하기 쉬울 수 있고, 특히 트리 구조 탐색, 분할 정복 알고리즘 등 특정 문제에서는 자연스러운 해결 방식을 제시한다.
    • 수학적 귀납법과의 유사성: 수학적 귀납법의 구조와 유사하여, 특정 수학적 개념이나 알고리즘을 구현할 때 좋다
  • 단점:
    • 스택 오버플로우 위험: 종료 조건이 잘못 설정되거나 재귀 호출 깊이가 너무 깊어지면 콜 스택이 메모리 제한을 초과하여 스택 오버플로우가 발생할 수 있다.
    • 성능 저하 가능성: 함수 호출과 반환에 따른 오버헤드가 발생하고, 동일한 계산을 반복할 수 있어 반복문에 비해 일반적으로 성능이 떨어질 수 있다.
  • 주요 사용처:
    • 트리 및 그래프 탐색: 깊이 우선 탐색 (DFS) 등 트리나 그래프 구조를 탐색하는 알고리즘 구현에 효과적
    • 분할 정복 알고리즘: 퀵 정렬, 병합 정렬 등 큰 문제를 작은 문제로 나누는 알고리즘 구현에 자연스럽게 적용된다.
    • 수학적 귀납적 정의: 팩토리얼, 피보나치 수열 등 수학적으로 재귀적인 정의를 갖는 함수를 구현할 때 좋다.

반복문 (Loop)

반복문은 특정 조건이 만족될 때까지 코드 블록을 반복적으로 실행하는 제어 구조. for, while 등이 있다.

  • 작동 방식: 주어진 조건이 참인 동안 코드 블록 내의 명령문을 순차적으로 실행. 각 반복마다 조건이 다시 평가.
  • 장점:
    • 성능 우수: 함수 호출 오버헤드가 없어 일반적으로 재귀 함수보다 실행 속도가 빠르고 효율적.
    • 스택 오버플로우 위험 감소: 스택 메모리 사용이 예측 가능하며, 재귀 호출 깊이에 따른 스택 오버플로우 위험이 적다.
  • 단점:
    • 코드의 복잡성 증가 가능성: 복잡한 반복 로직을 구현할 때 코드가 길어지고 이해하기 어려워질 수 있다.
    • 문제의 본질적인 구조 반영 어려움: 특정 문제의 재귀적인 구조를 직접적으로 반영하기 어려울 수 있다.
  • 주요 사용처:
    • 배열 및 리스트 처리: 배열이나 리스트의 모든 요소를 순회하며 특정 작업을 수행할 때 효율적
    • 정해진 횟수만큼 반복: 특정 작업을 명확한 횟수만큼 반복해야 할 때 for 루프가 유용하다.
    • 조건 기반 반복: 특정 조건이 충족될 때까지 반복해야 할 때 while 루프가 적합하다.

결론

재귀 함수와 반복문은 각각의 장단점을 가지고 있으며, 해결하려는 문제의 특성에 따라 더 적합한 방법이 있을 수 있다.

  • 간결하고 문제의 구조를 명확하게 반영해야 할 경우, 특히 재귀적인 특성을 가진 문제에서는 재귀 함수가 좋은 선택이 될 수 있다. 다만, 스택 오버플로우와 성능 문제를 염두에 두어야 한다.
  • 성능이 중요하고 반복 횟수나 조건이 명확하며, 스택 오버플로우 위험을 줄여야 할 경우에는 반복문을 사용하는 것이 일반적.