알고리즘

재귀

hongdangmoo 2023. 1. 12. 22:06

◎ 재귀

-> 원래의 자리로 되돌아온다는 의미로, 자바에서 메서드 자신을 다시 호출하여 같은 코드가 반복되게 한다.

public class Recursive {
    public void recursive(){
        System.out.println("recursive");
        recursive(); // 재귀 호출
    }

    public static void main(String[] args) {
        Recursive r = new Recursive();
        r.recursive();
    }
}

-> recursive()메서드를 계속해서 호출하여 위와 같이 recursive가 반복되어 출력된다.

 

-> 재귀함수의 장점 : 위 코드의 결과처럼 반복문을 따로 작성하지 않아도 자기 자신을 반복 호출하여 반복문의 기능을 한다. 메서드 내에 메서드를 호출하기만 하면 되기 때문에 반복문 코드를 작성하는 것 보다 코드가 간결해지고, 수정이 쉽다.

 

-> 재귀함수의 단점 

- 반복문은 코드의 흐름을 직관적으로 파악할 수 있는 반면 재귀함수는 그 흐름을 직관적으로 파악하기 어렵다. 

- 메서드를 반복 호출하여 지역변수, 매개변수, 반환값을 모두 process stack에 저장하여 반복문에 비해 더 많은 메모리를 사용하게 된다. 

- 메서드를 호출하고, 메서드가 종료된 이후에 복귀를 위한 컨텍스트 스위칭 비용이 발생한다.

 public int sum(int num) {
        int sum = 0;
        for (int i = 1; i <= num; i++) {
            sum += i;
        }
        return sum;
    }

-> 반복문으로 1부터 매개변수 num까지의 합을 구하는 코드다.

 

public int sum(int num) {
        if(num == 0) return 0;
        return num + sum(num - 1); // 재귀 호출
    }

-> 재귀 호출을 이용하여 1부터 매개변수num까지의 합을 구하는 코드다.

 

-> 재귀함수 코드에서 num에 3이 들어간 경우 그 동작과정이다.

 

-> 재귀함수에서는 반드시 재귀함수를 멈추는 코드를 작성해야한다. 위 코드에서 'if(num==0) return 0' 이 재귀함수를 멈추는 코드다. num이 0인 경우 0을 리턴하게 하여 그 이후의 계산도 할 수 있도록 코드를 작성해야 한다.

 

 

☆ 오늘 학습의 중요 포인트 및 이해도

학습 이해도 : ★★★완벽히 이해함, ★★이해함 ★ : 미흡

재귀 함수 : ★★(개념과 동작 과정에 대해 이해는 했으나, 재귀함수를 활용한 다양한 예제를 풀어보면서 사용방법을 익혀야 함)