재귀함수 (recursion)

2023. 10. 9. 14:57알고리즘

| 재귀함수란?

함수가 자기자신을 다시 호출하는 구조로 만들어진 함수이다.

반드시 종료시점 (return 문) 이 존재해야 한다.

종료점이 없다면 계속해서 스택에 함수가 추가 된다.

그로 인해 메모리 사용량이 불필요하게 많이 소모되며 스택오버플로우가 발생할 수 있다.

 

두가지를 이해하고 넘어가면 재귀함수를 조금 더 쉽게 이해 할 수 있다.

- base case (재귀의 탈출 조건)

- recursive case (자기 자신을 호출)

 

| 기본적인 재귀 함수 예시

recursionTest 함수에 인자로 넘어온 num을 하나씩 줄여가는 함수이다.

여기서 base case 조건은 num이 0보다 작거나 같을 때 return 으로 0을 뱉어준다.

 

| for문으로 동일한 기능 구현

모든 재귀함수는 반복문으로 동일한 기능을 수행할 수 있다.

함수는 총 1번만 실행되고 for문에서 연산을 시작한다.

for 내부의 조건으로 loop를 중단 시킨다.

 

| 재귀로 팩토리얼 구현

위의 코드도 for문으로 충분히 가능한 코드이다.

 

| 헬퍼 메소드 응용

arr로 넘어온 배열에서 홀수인 값만 추출해서 값을 뱉어내는 함수이다.

result 배열은 recursionTest 함수를 호출하면 항상 빈배열로 초기화된다.

여러가지 방법이 있지만 재귀를 공부하는 입장에서 재귀로 문제를 풀어보려고 했다.

문제를 보고 바로 두가지의 방법이 떠올랐다.

1. for문을 돌려서 홀수인 값만 result배열에 담아주는 법

2. 배열의 내장함수인 filter 메소드를 사용하는 방법

 

helper 함수는 for문과 동일한 작업을 수행한다.

일단 numArr이 넘어왔을 때 길이가 0 이면 비교해야할 값이 없기 때문에 빈배열을 return 했다.

그리고 배열의 0번째를 비교하고 값이 홀수면 result배열에 넣어주었다.

그 이후 배열의 0번째는 지워서 다시한번 helper 함수를 호출했다.

| 재귀함수를 사용하며 주의 할 점

- 종료점이 없다면 계속해서 함수는 스택에 쌓인다.

- 무조건 마지막은 어떠한 값을 도출해서 그 값을 내보내야 한다.

 

 

'알고리즘' 카테고리의 다른 글

해시 [Hash]  (1) 2023.12.12
버블 정렬 (Bubble Sort)  (1) 2023.11.09
이진 검색 (Binary Search)  (1) 2023.10.11
선형 검색 (Linear Search)  (0) 2023.10.10
빅오 표기법 (big O notation)  (0) 2023.09.13