파이썬에서 함수와 모듈은 프로그램을 짧고 깔끔하게 만들어 주는 도구입니다.
오늘은 그중에서도 조금 어려울 수 있는 재귀 함수에 대해 알아보려고 합니다. 재귀 함수는 문제가 복잡할 때 매우 유용하게 쓰일 수 있지만, 개념을 처음 배우는 초보자에게는 헷갈릴 수 있어요.
그러니 차근차근 쉬운 예시와 함께 배워봅시다!
1. 함수와 모듈이란?
함수란?
함수는 반복되는 작업을 묶어서 이름을 붙인 코드의 모음입니다. 우리가 프로그램을 작성할 때 같은 작업을 여러 번 해야 하는 경우, 그 작업을 함수로 만들어서 필요할 때마다 호출할 수 있습니다.
함수 정의 예시
def hello():
print("안녕하세요!")
위 코드에서 hello()라는 함수를 만들었어요. 이 함수를 호출하면 "안녕하세요!"라는 문장이 출력됩니다.
모듈이란?
모듈은 함수와 여러 기능들을 모아놓은 파일입니다. 하나의 큰 프로그램을 여러 개의 작은 파일로 나누어서 관리할 수 있게 해주죠. 예를 들어, 파이썬에는 math라는 기본 모듈이 있습니다. 이 모듈을 사용하면 수학 계산을 쉽게 할 수 있죠.
모듈 사용 예시
import math
print(math.sqrt(16)) # math 모듈의 sqrt 함수 사용
math 모듈의 sqrt 함수는 제곱근을 계산하는 함수입니다. 이처럼 모듈을 사용하면 프로그램을 더 효율적으로 작성할 수 있습니다.
2. 재귀 함수란?
이제 재귀 함수에 대해 알아볼 차례입니다. **재귀 함수(Recursion)**란 자기 자신을 다시 호출하는 함수를 말합니다. 조금 헷갈릴 수 있지만, 쉽게 말하면 문제를 더 작은 문제로 쪼개서 반복적으로 푸는 방법이라고 할 수 있어요.
재귀의 핵심 개념
재귀 함수는 두 가지 필수 조건이 있습니다.
- 기저 조건(Base Case): 재귀 함수가 멈추는 조건. 이 조건이 없으면 함수가 무한히 실행되면서 프로그램이 멈추게 됩니다.
- 재귀 호출(Recursive Call): 함수가 자기 자신을 다시 부르는 부분. 이때 문제를 조금 더 간단하게 만들어 나가는 것이 중요합니다.
3. 재귀 함수 예시: 팩토리얼
팩토리얼은 어떤 숫자 n에 대해 n! = n * (n-1) * (n-2) * ... * 1로 계산됩니다. 이를 재귀 함수로 구현해볼게요.
팩토리얼 재귀 함수 코드
def factorial(n):
if n == 1: # 기저 조건
return 1
return n * factorial(n - 1) # 재귀 호출
설명
- 기저 조건: if n == 1에서 함수는 더 이상 자기 자신을 호출하지 않고 1을 반환합니다. 기저 조건이 없으면 재귀 함수가 계속 호출되어 무한 루프에 빠질 수 있어요.
- 재귀 호출: n * factorial(n - 1)에서 함수는 자기 자신을 호출하면서 n을 1씩 줄여갑니다. 결국, factorial(1)이 될 때까지 줄어들고 계산이 마무리됩니다.
팩토리얼 예시
print(factorial(5)) # 출력: 120
실행 과정
- factorial(5)는 5 * factorial(4)를 호출.
- factorial(4)는 4 * factorial(3)를 호출.
- 계속해서 줄어들다가 factorial(1)에서 기저 조건에 도달하여 1을 반환.
- 마지막에 5 * 4 * 3 * 2 * 1 = 120이 계산됩니다.
4. 재귀 함수 예시: 피보나치 수열
재귀 함수는 피보나치 수열(Fibonacci Sequence)를 계산할 때도 자주 사용됩니다. 피보나치 수열은 1, 1, 2, 3, 5, 8, 13, ... 처럼 이전 두 숫자의 합으로 이루어진 수열이에요.
피보나치 재귀 함수 코드
def fibonacci(n):
if n == 1 or n == 2: # 기저 조건
return 1
return fibonacci(n - 1) + fibonacci(n - 2) # 재귀 호출
설명
- 기저 조건: n이 1이거나 2일 때는 1을 반환합니다. 피보나치 수열의 첫 번째와 두 번째 숫자는 항상 1이기 때문이죠.
- 재귀 호출: fibonacci(n - 1) + fibonacci(n - 2)에서 함수는 자기 자신을 두 번 호출하여 이전 두 숫자의 합을 계산합니다.
피보나치 수열 예시
print(fibonacci(6)) # 출력: 8
실행 과정
- fibonacci(6)은 fibonacci(5) + fibonacci(4)로 나눠집니다.
- 계속해서 나눠지다가, fibonacci(1)과 fibonacci(2)에서 기저 조건에 도달하여 1을 반환.
- 최종적으로 8이 계산됩니다.
5. 재귀 함수의 장단점
장점
- 복잡한 문제를 간단하게 해결할 수 있습니다. 문제를 작게 나누어 푸는 방식이라, 특히 수학적 문제나 자료 구조에서 유용합니다.
- 코드가 깔끔해집니다. 반복문을 쓰는 것보다 더 짧고 간결한 코드로 문제를 해결할 수 있습니다.
단점
- 성능 문제가 있을 수 있습니다. 재귀 함수는 호출될 때마다 메모리를 사용하기 때문에, 너무 깊은 재귀 호출은 메모리 부족이나 성능 저하를 일으킬 수 있습니다.
- 기저 조건을 잘못 설정하면 무한 루프에 빠질 수 있습니다. 프로그램이 멈추지 않고 계속 실행되면서 오류가 발생할 수 있죠.
6. 모듈을 사용한 재귀 함수
파이썬에서는 여러 함수를 모아서 모듈로 만들어 사용할 수 있습니다.
이렇게 하면 복잡한 프로그램을 더 쉽게 관리할 수 있어요.
예를 들어, 재귀 함수를 파일에 저장해 다른 파일에서 불러와 사용할 수 있습니다.
# mymodule.py
def factorial(n):
if n == 1:
return 1
return n * factorial(n - 1)
다른 파일에서 모듈을 불러와 사용할 수 있습니다.
# main.py
import mymodule
print(mymodule.factorial(5)) # 출력: 120
이처럼 모듈을 사용하면 코드를 더 깔끔하게 나누어서 관리할 수 있습니다.
재귀 함수 활용하기
재귀 함수는 처음에는 헷갈릴 수 있지만, 차근차근 예시를 통해 익히면 강력한 도구가 될 수 있습니다. 팩토리얼과 피보나치 수열 같은 문제를 직접 해결해 보면서 재귀 함수의 작동 원리를 이해해 보세요.
추가로 도전해볼 문제
- 재귀를 사용해 역순으로 문자열 출력하기.
- 재귀로 리스트 안에 있는 모든 숫자의 합 구하기.
구독!! 공감과 댓글,
광고 클릭은 저에게 큰 힘이 됩니다.
Starting Google Play App Distribution! "Tester Share" for Recruiting 20 Testers for a Closed Test
'Python > Python Programming language' 카테고리의 다른 글
[초급] 파이썬 함수와 모듈 / 모듈과 패키지 (4) | 2024.10.01 |
---|---|
[초급] 파이썬 함수와 모듈 / 람다 함수 (1) | 2024.10.01 |
[초급] 파이썬 함수의 정의와 호출/ 함수의 정의와 호출 (2) | 2024.10.01 |
[초급] 파이썬 반복 제어문 / break, continue, pass (1) | 2024.09.22 |
[초급] 파이썬 반복문 / 중첩 반복문 (0) | 2024.09.22 |