[알고리즘] 재귀함수

SangDosa·2024년 7월 15일

알고리즘

목록 보기
5/7

재귀함수

함수에서 자기 자신을 다시 호출해 작업을 수행하는 방식
특정한 트리거가 있지 않는 이상 지속적으로 자기 자신을 호출해 작업을 진행해 반복문을 구현할 때 사용한다.

대표적으로 "펙토리얼 함수", "하노이의 탑" 등을 구현할 때 사용된다.

반복문(for, while)에 들어가야할 변수들을 다수 생성하지 않고, 동일한 매개변수를 통해 반복 작업을 하는 것이기 때문에 변수의 수를 줄일 수 있다.
함수를 호출하게 되면 해당 함수에 대한 지역변수, 매개변수, 반환값을 모두 stack에 저장해야 하는데, 재귀함수에서 자기 자신을 많이 호출하게 되면 그만큼 메모리를 사용하게 되기 때문에 속도 저하가 될 수 있습니다. 또한 복귀를 위한 컨텍스트 스위칭에 비용이 발생하게 됩니다.

▷ 위 단점을 없에기 위해서 꼬리 재귀를 사용하는 경우가 많아졌다.

꼬리 재귀(tail call recursion) :

자기 자신을 기다리며 생기는 메모리 낭비를 최소화 시키기 위해 재귀 호출이 끝나는 시점에서 바로 결과만 반환하도록 함수를 구성하는 것

반환 시점에 함수의 상태유지 및 추가 연산을 하지 않기에 메모리 사용률을 줄일 수 있다.


소스

작성 언어 java

// 펙토리얼 함수
public static int fac(int num){
    if(num == 1){
        return 1;
    }else{
        return num * fac(num - 1);
    }
}

// 펙토리얼 함수(꼬리 재귀)
public static int facTail(int num, int result){
    if(num == 1){
        return 1;
    }else{
        return fac(num - 1, result * num);
    }
}

참고

https://catsbi.oopy.io/dbcc8c79-4600-4655-b2e2-b76eb7309e60
https://wayhome25.github.io/cs/2017/04/15/cs-16-1-recursion/

profile
조용한 개발자

0개의 댓글