재귀(再歸)는 사전적으로 "원래의 자리로 되돌아가거나 되돌아옴"의 의미를 가진다.
따라서 재귀함수는 말그대로 자기 안에서 자기 자신을 호출하는 함수를 의미하게 된다.
<재귀함수 예시>
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 가 시작되었다. 자료구조 / 알고리즘 / 네트워크 등에 대해 학습할 예정이다.
어제 회고에서 다짐했던 것 처럼 앞으로 매일 코딩문제를 풀어야지 생각하고있었는데 마침 데일리 코딩 문제가 제공된다고 한다.
문제를 풀 때 한번 생각이 꼬이기 시작하면 오히려 되돌아오기가 어려운 상황들이 있었다.
차분화게 생각해보고, 필요할때는 손으로 구조를 그려보기도 하면서 스스로 해결할 수 있도록 연습할것이다.
(실제로 재귀함수 문제를 풀어보니 머리로만은 안되던 것들이 구조를 그려보니 신기하게도 해결방향이 보였다!)
'부트캠프 개발일기 > Algorithm' 카테고리의 다른 글
26일차: 알고리즘(Algorithm)과 시간복잡도(Time Complexity) (0) | 2023.03.21 |
---|---|
25일차: 순회(Traversal) (0) | 2023.03.20 |
24일차: 자료구조(Graph, Tree, BST) (0) | 2023.03.17 |
23일차: 자료구조 (Stack, Queue) (0) | 2023.03.16 |
22일차: JSON, 재귀함수 실습 (1) | 2023.03.15 |