순환 호출 (circular call) - 재귀적 호출 (recursive call)
함수 내부에서 함수가 자기 자신을 또다시 호출하는 행위를 의미합니다.
이러한 재귀 호출은 자기가 자신을 계속해서 호출하므로, 끝없이 반복되게 됩니다.
재귀의 특징
- 무한 루프에 빠지지 않기 위해 일정한 탈출 조건이 있어야 한다.
- 코드를 단순화 할 수 있다.
- 스택 공간을 이용하므로 무리하게 호출하면 스택 오버플로우가 일어날 수 있다.
- 디버깅 및 실행 흐름을 파악하기 힘들다
목차
관련글
꼬리재귀 - Tail Recursion
https://steadiness-dev-invest.tistory.com/86
1. 어떤 경우에 사용할까?
1-1. 프로그램 전체가 무한이 반복이 필요할 경우
예를 들어서 서버에서 데이터를 한건씩 불러와서 전처리를 한 뒤 서버에 저장하는 작업을 하는 프로그램이 있습니다.
이 프로그램의 전제조건은
- 상시 동작
- 멀티 프로세싱
이 프로그램은 전처리 작업에 시간이 걸리기 때문에 5대의 컴퓨터에서 동시 구동 가능하도록 프로그램이 구현되어
5대가 병렬로 돌아가는 형태의 프로그램으로 제작돼야 합니다.
재귀 호출을 이용하여
데이터가 없을 경우는 10분간 대기후 재실행,
데이터가 있을 경우엔 데이터 처리 후 자신을 재 실행하는 형태로 구현하면
이 프로그램은 상시 동작이 만족되며, 서버에서 데이터가 처리 중이라고 판별할 수 있는 값만 세팅해두면
멀티 프로세싱이 가능한 프로그램을 만들 수 있습니다.
물론 무한 반복문으로 프로세스를 작성해도 큰 차이는 없습니다.
1-2. 알고리즘 자체가 자연스러울 때
재귀 함수에선 대표적인 예시는 피보나치수열입니다.
공식은 f(n) = f(n - 1) + f(n - 2)입니다.
아래 형태로 사용하면 함수를 무한 호출하면서 피보나치수열을 구하게 됩니다.
def fibonacci_numbers(num):
if num <= 1:
return num
else:
return fibonacci_numbers(num-1) + fibonacci_numbers(num-2)
print(fibonacci_numbers(30))
1-3. 변수를 줄일 수 있다.
변수는 num 하나로 변수 개수가 정말 필요가 없습니다.
재귀 구현 시
def fibonacci_numbers(num):
if num <= 1:
return num
else:
return fibonacci_numbers(num-1) + fibonacci_numbers(num-2)
print(fibonacci_numbers(30))
반복문 구현 시
fibo_save = 0
fibo_first = 1
fibo_second = 0
for cnt in range(1, 100000):
fibo_save = fibo_first + fibo_second
fibo_second, fibo_first = fibo_first, fibo_save
print(fibo_save)
2. 장점 & 단점
장점
mutable state (변경 가능한 상태)를 제거하여 프로그램 오류가 발생할 수 있는 가능성을 줄인다
단점
속도가 느리다.
개선
꼬리 재귀 (tail recursion) 방식으로 구현 시 속도 문제를 개선할 수 있다.
꼬리 재귀 (tail recursion)
https://steadiness-dev-invest.tistory.com/86
3. 예시 코드
마무리
보통 반복문으로 구현 가능하지만 가끔 재귀 함수로만 가능한 아이들도 종종 있더군요.
상황에 따라 잘 쓰면 정말 좋은 방법이라고 생각됩니다.
혹시나 파이썬 작업 중 maximum recursion depth exceeded in comparison 에러가 발생했다면
https://steadiness-dev-invest.tistory.com/85
그럼 이만~
'용어정리 > IT' 카테고리의 다른 글
프레임워크 , 라이브러리, API (0) | 2022.08.25 |
---|---|
객체지향이란 무엇인가 (0) | 2022.08.13 |
꼬리재귀 - Tail Recursion (0) | 2021.06.04 |