자료구조 & 알고리즘

재귀 알고리즘의 비재귀적 표현

kyoulho 2023. 12. 10. 13:17

예제 재귀 알고리즘

static void recur(int n) {
    if (n > 0) {
        recur(n - 1);
        System.out.println(n);
        recur(n - 2);
    }
}

 

 

꼬리 재귀의 제거

메서드의 꼬리에서 재귀 호출하는 메서드 recure(n-2)는 아래처럼 바꿀 수 있다.

n의 값을 n-2로 업데이트하고 메서드의 시작지점으로 돌아간다

 

코드로 표현하자면 이렇게 할 수 있다.

static void recur(int n) {
    while (n > 0) {
        recur(n - 1);
        System.out.println(n);
        n = n - 2;
    }
}

 

재귀의 제거

앞에 재귀를 제거하기 위해서는 n의 값을 잠시 저장해야 할 필요가 있다.  n을 출력하기 전에 recur(n-1)을 실행해야 하기 때문이다.

이때 문제를 해결하기 위해서는 스택이 필요하다.

 static void recur(int n) {
    Stack<Integer> stack = new Stack<>();
    while (true) {
        if (n > 0) {
            stack.push(n);
            n = n - 1;
            continue;
        }
        if (!stack.isEmpty()) {
            n = stack.pop();
            System.out.println(n);
            n = n - 2;
            continue;
        }
        break;
    }
}

 

 

'자료구조 & 알고리즘' 카테고리의 다른 글

버블 정렬, 칵테일 정렬  (0) 2023.12.11
정렬  (0) 2023.12.11
유클리드 호제법(Euclidean algorithm)  (0) 2023.12.09
경우의 수(조합, 순열)  (1) 2023.12.07
구간 합  (0) 2023.12.06