본문 바로가기
부트캠프 개발일기/Algorithm

21일차: 재귀(Recursion)

by shyun00 2023. 3. 14.

재귀(再歸)는 사전적으로 "원래의 자리로 되돌아가거나 되돌아옴"의 의미를 가진다.

따라서 재귀함수는 말그대로 자기 안에서 자기 자신을 호출하는 함수를 의미하게 된다.

 

<재귀함수 예시>

class Example{
    public int factorial(int num){

    if(num <= 1) return 1;
    return num * factorial(num-1)
    }
}

// 매개변수로 5를 넣고 factorial 메서드를 실행하면
// 5 * 4 * 3 * 2 (* 1)의 결과인 120을 리턴한다.

이처럼 재귀함수를 사용하게되면 for, while 같은 반복문을 사용하지 않아서 코드가 간결해진다.

그러나 코드를 직관적으로 파악하기는 어려워진다는 단점이 있다. -> 연습을 통해서 익숙해지도록 하자!

 

재귀함수가 성립하기 위해서는 구현하고자하는 내용을 작은단위로 쪼갤 수 있어야한다.

또한 재귀 호출이 종료되는 조건(시점)이 있어야한다.

 

위의 사례를 예로 들면,

 factorial 의 경우 1부터 1씩 증가시키면서 정해진 값까지 곱하는 형태를 가진다.

factorial 5 = 1 * 2 * 3 * 4 * 5

(1 * 2 * 3 * 4) * 5 // 문제를 작은 단위로 쪼갤 수 있다
(1 * 2 * 3) * 4
(1 * 2) * 3
(1) * 2 // 가장 작은 문제 조각 -> 여기에 해당하는 케이스를 base case라고 하며 재귀함수 탈출과 연관되어있다.

따라서 가장 작은 문제(base case)에 대한 리턴값을 설정하고, 나머지 문제(recursive case)를 해결하여 재귀함수를 만들 수 있다.


오늘부터 새롭게 Section 2 가 시작되었다. 자료구조 / 알고리즘 / 네트워크 등에 대해 학습할 예정이다.

 

어제 회고에서 다짐했던 것 처럼 앞으로 매일 코딩문제를 풀어야지 생각하고있었는데 마침 데일리 코딩 문제가 제공된다고 한다.

문제를 풀 때 한번 생각이 꼬이기 시작하면 오히려 되돌아오기가 어려운 상황들이 있었다.

차분화게 생각해보고, 필요할때는 손으로 구조를 그려보기도 하면서 스스로 해결할 수 있도록 연습할것이다.

(실제로 재귀함수 문제를 풀어보니 머리로만은 안되던 것들이 구조를 그려보니 신기하게도 해결방향이 보였다!)