이 영역을 누르면 첫 페이지로 이동
Coding Groot 블로그의 첫 페이지로 이동

Coding Groot

페이지 맨 위로 올라가기

Coding Groot

코딩 블로그

꼬리 재귀

  • 2025.03.20 01:38
  • Programming
글 작성자: Coding Groot

면접을 준비하며 남긴 노트를 발행해보고 있습니당
꼬리 재귀에 관해 알아봅시당.

Tail call optimization (TCO)

def foo():  
    return bar()  

def bar():  
    pass  

꼬리 재귀(tail recursion)

꼬리 재귀 함수의 마지막 단계에서 자기 자신을 호출할 때 추가 연산 없이 바로 호출하는 경우를 의미한다. 꼬리 재귀는 일부 컴파일러에서 최적화를 통해 반복문처럼 처리되어 스택 오버플로우의 위험을 줄일 수 있다.

일반 재귀 함수

public class FactorialExample {  
    // Normal recursive function to calculate factorial  
    public static int factorial(int n) {  
        if (n == 0 || n == 1) {  
            return 1;  
        }  
        return n \* factorial(n - 1); // Not tail recursion because multiplication happens after the recursive call  
    }  

    public static void main(String\[\] args) {  
        System.out.println("Factorial (Normal Recursion): " + factorial(5)); // Output: 120  
    }  
}  

n * factorial(n - 1) 연산이 재귀 호출이 반환된 후에 수행함
→ 각 재귀 호출이 자식 호출이 완료될 때까지 기다려야 하기 때문에 이 형태는 꼬리 재귀가 아님!!

꼬리 재귀 함수

public class FactorialTailRecursionExample {  
    // Tail-recursive function to calculate factorial  
    public static int factorialTail(int n, int accumulator) {  
        if (n == 0 || n == 1) {  
            return accumulator;  
        }  
        return factorialTail(n - 1, n \* accumulator); // Tail recursion because the recursive call is the last operation  
    }  

    public static void main(String\[\] args) {  
        System.out.println("Factorial (Tail Recursion): " + factorialTail(5, 1)); // Output: 120  
    }  
}  

factorialTail(int n, int accumulator) 메서드에서는 재귀 호출 factorialTail(n - 1, n * accumulator)이 함수의 마지막 연산임.
→ 재귀 호출 후에 추가적인 연산이 없기 때문에 꼬리 재귀에 해당!

찾아 본 것들

파이썬은 TRO(Tail Recursion Optimization)를 지원하지 않는다. (참고)

자바도 기본적으로 TRO을 지원하지 않는다고 한다. (하지만 특정 JVM 최적화 버전은 지원할 수도 있다) (참고)

추가로 보면 좋을 TRO 관련 글: https://rebugs.tistory.com/168

면접 질문 예상해보기

재귀 함수를 사용할 때 스택 메모리 영역에 어떤 일이 발생하는지 설명해 주세요. 재귀 호출이 깊어질수록 스택 오버플로우가 발생할 가능성에 대해 어떻게 생각하나요?

재귀 함수 호출 시마다 새로운 스택 프레임이 생성되며, 호출이 끝날 때마다 스택 프레임이 해제됩니다. 재귀 깊이가 깊어질수록 스택 사용량이 증가하여, 스택 오버플로우(Stack Overflow)가 발생할 가능성이 있습니다.

꼬리 질문. 재귀 함수는 일반적으로 반복문보다 더 많은 메모리를 사용합니다. 이를 최적화할 수 있는 방법을 아시나요?

메모이제이션으로 중간 결과를 저장해 중복 계산을 피함으로써 메모리 사용을 줄일 수 있습니다.

또 꼬리 질문. 그래도 재귀 호출이 많아졌을 때 메모리가 부족할 수 있습니다. 이것을 해결할 수 있는 다른 방법을 아시나요?

꼬리 재귀(Tail Recursion) 최적화가 있습니다. 꼬리 재귀는 재귀 호출이 끝나기 전에 불필요한 스택 프레임을 제거하여 스택 사용을 줄입니다. 일부 컴파일러는 꼬리 재귀를 최적화하여 반복문처럼 처리하기도 한다고 알고 있습니다.

반응형

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • 프로세스 맛보기

    프로세스 맛보기

    2025.03.20
  • 시스템 콜

    시스템 콜

    2025.03.20
  • 캐시

    캐시

    2025.03.20
  • 폰 노이만 구조의 특징

    폰 노이만 구조의 특징

    2025.03.20
다른 글 더 둘러보기

정보

Coding Groot 블로그의 첫 페이지로 이동

Coding Groot

  • Coding Groot의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록
  • 소개
  • 블로그 저작권

카테고리

  • 분류 전체보기 (182)
    • Git (23)
      • Git Tutorial (9)
      • Git Note (7)
      • Git Lecture (7)
    • Programming Language (1)
      • C (2)
      • C Sharp (5)
      • Java (4)
      • JavaScript (7)
      • Julia (5)
      • Python (4)
    • Programming (8)
      • Algorithm (2)
      • Compiler (5)
      • Data Structure (0)
      • Web (12)
      • NestJS (2)
    • DevOps, Infra (36)
      • Apple (6)
      • Cloud (15)
      • Database (1)
      • Network (4)
      • Linux (8)
    • Game Programming (11)
      • Unity Tutorial (5)
      • Unity Note (6)
    • Hardware Design (1)
      • Digital Circuit (1)
    • Note (49)
      • Coffee (2)
      • Retrospect (15)
      • Reading List (14)
    • Mathematics (1)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • 한빛미디어
  • aws
  • 회고
  • 서평
  • tutorial
  • Github
  • git
  • javascript
  • 전체 보기…

정보

Coding Groot의 Coding Groot

Coding Groot

Coding Groot

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기

나의 외부 링크

  • GitHub
  • SlideShare
  • 유니티 2020 수업
  • TIL Blog
  • 모도코

방문자

  • 전체 방문자
  • 오늘
  • 어제
Powered by Tistory / Kakao. Copyright © Coding Groot.

티스토리툴바