📌 Python 함수 심화 – Chapter 6-8. 조기 리턴
✅ 1. 조기 리턴이란?
- 함수에서 return은 함수의 종료를 알리는 역할을 함.
- return을 만나면 함수는 즉시 종료되고, 함수를 호출한 위치로 돌아감.
- 메모이제이션을 활용한 피보나치 수열 예제에서 조기 리턴의 중요성 확인 가능.
✅ 2. 피보나치 수열 – 조기 리턴 적용 전 코드
memo = {
1: 1,
2: 1
}
count = 0
def oz_fibo(n):
print(f'피보나치 수열 {n}을 구하는 중입니다.')
global count
count += 1
if n in memo:
return memo[n] # 조기 리턴을 통해 이미 계산된 값 반환
# 값이 없는 경우 재귀적으로 계산
output = oz_fibo(n - 1) + oz_fibo(n - 2)
memo[n] = output # 계산된 값을 memo에 저장
return output
n = int(input("구하고자 하는 피보나치 수열의 수를 입력해주세요: "))
oz_fibo(n)
print(f"피보나치 수열 {n}을 구하기 위해 계산된 횟수는 {count}입니다.")
- 출력 예시
피보나치 수열 5을 구하는 중입니다.
피보나치 수열 4을 구하는 중입니다.
피보나치 수열 3을 구하는 중입니다.
피보나치 수열 2을 구하는 중입니다.
피보나치 수열 1을 구하는 중입니다.
피보나치 수열 5을 구하기 위해 계산된 횟수는 9입니다.
✅ 3. 코드 리팩토링 – 조기 리턴 적용
- memo에 값이 있으면 조기에 함수 종료
- 중복된 연산을 피하여 성능 개선
memo = {
1: 1,
2: 1
}
count = 0 # 전역 변수 count를 초기화
def oz_fibo(n):
"""
oz_fibo 함수는 주어진 숫자 n에 해당하는 피보나치 수를 메모이제이션을 사용하여 재귀적으로 계산합니다.
또한, 함수 호출 횟수를 전역 변수 count에 기록합니다.
매개변수:
- n (int): 피보나치 수열에서 원하는 위치
반환 값:
- int: n번째 피보나치 수
"""
print(f'피보나치 수열 {n}을 구하는 중입니다.')
global count
count += 1
if n in memo:
return memo[n] # 조기 리턴을 통해 이미 계산된 값을 즉시 반환
# 값이 없는 경우만 재귀적으로 계산하여 memo에 저장
memo[n] = oz_fibo(n - 1) + oz_fibo(n - 2)
return memo[n]
n = int(input("구하고자 하는 피보나치 수열의 수를 입력해주세요: "))
oz_fibo(n)
print(f"피보나치 수열 {n}을 구하기 위해 계산된 횟수는 {count}입니다.")
- 출력 예시
피보나치 수열 10을 구하는 중입니다.
...
피보나치 수열 10을 구하기 위해 계산된 횟수는 17입니다.
✅ 4. 조기 리턴을 사용한 코드의 장점
- 성능 향상
- 조기 리턴을 통해 중복된 연산을 피할 수 있음.
- 실행 시간이 단축되고, 함수 호출 횟수 감소.
- 가독성 향상
- 조건이 충족되면 바로 리턴해 코드가 간결해짐.
- 오류 방지
- 불필요한 연산을 줄여 오류 가능성 감소.
✅ 이해도 체크리스트
- 조기 리턴이란?
- 함수가 특정 조건을 만족할 경우, 즉시 종료하고 값을 반환하는 것.
- 조기 리턴을 사용하면 어떤 장점이 있나요?
- 중복된 연산을 방지하여 성능을 개선할 수 있음.
- 코드가 간결하고 명확해짐.
- 조기 리턴을 사용하지 않으면 어떤 문제가 발생할까요?
- 중복 연산으로 인해 성능 저하 발생.
- 불필요한 연산으로 인해 시간과 자원 낭비.
📌 Python 함수 심화 – oz_fibo(9) 계산 과정
✅ 피보나치 수열
- 피보나치 수열은 앞의 두 수를 더해서 다음 수를 만들어가는 수열입니다.
1, 1, 2, 3, 5, 8, 13, 21, 34, ...
n (번째 수) 값
1번째 | 1 |
2번째 | 1 |
3번째 | 2 |
4번째 | 3 |
5번째 | 5 |
6번째 | 8 |
7번째 | 13 |
8번째 | 21 |
9번째 | 34 |
🎯 oz_fibo(9)가 계산되는 과정
oz_fibo(9)
= oz_fibo(8) + oz_fibo(7)
✅ oz_fibo(8)을 계산
oz_fibo(8)
= oz_fibo(7) + oz_fibo(6)
✅ oz_fibo(7)을 계산
oz_fibo(7)
= oz_fibo(6) + oz_fibo(5)
✅ oz_fibo(6)을 계산
oz_fibo(6)
= oz_fibo(5) + oz_fibo(4)
✅ oz_fibo(5)을 계산
oz_fibo(5)
= oz_fibo(4) + oz_fibo(3)
✅ oz_fibo(4)을 계산
oz_fibo(4)
= oz_fibo(3) + oz_fibo(2)
✅ oz_fibo(3)을 계산
oz_fibo(3)
= oz_fibo(2) + oz_fibo(1)
= 1 + 1 = 2 # ✅ 여기서 처음으로 값이 확정!
✅ 이제 거슬러 올라가면서 값이 계산됩니다!
oz_fibo(3) → 2
oz_fibo(4) → 2 + 1 = 3
oz_fibo(5) → 3 + 2 = 5
oz_fibo(6) → 5 + 3 = 8
oz_fibo(7) → 8 + 5 = 13
oz_fibo(8) → 13 + 8 = 21
oz_fibo(9) → 21 + 13 = 34
✅ 왜 이런 방식으로 계산될까?
- 피보나치 수열은 **oz_fibo(n) = oz_fibo(n-1) + oz_fibo(n-2)**로 계산됩니다.
- 그래서 계속해서 n-1과 n-2로 거슬러 내려가면서 계산이 진행됩니다.
- n == 1과 n == 2가 기본값 1로 반환되기 때문에, 그 시점에서부터 값이 하나씩 확정되어 다시 올라가면서 더해지는 구조입니다.
🧠 정리된 계산 과정
oz_fibo(3) → 1 + 1 = 2
oz_fibo(4) → 2 + 1 = 3
oz_fibo(5) → 3 + 2 = 5
oz_fibo(6) → 5 + 3 = 8
oz_fibo(7) → 8 + 5 = 13
oz_fibo(8) → 13 + 8 = 21
oz_fibo(9) → 21 + 13 = 34
✅ if 조건이 어떻게 작동하는지!
def oz_fibo(n):
if n == 1:
return 1
if n == 2:
return 1
return oz_fibo(n - 1) + oz_fibo(n - 2)
- 재귀적으로 계속 내려가다가 n이 1이나 2가 되면 1을 반환합니다.
- 이 반환된 값이 다시 상위 함수로 전달되어 더해지면서 값이 확정됩니다.
🎯 그래서 결론은?
- oz_fibo(9)을 호출하면, 내부적으로 oz_fibo(8)과 oz_fibo(7)을 또 호출합니다.
- 이 과정이 반복되다가 **oz_fibo(2)나 oz_fibo(1)**에 도달하면, 1이라는 값을 반환하게 됩니다.
- 이 값들이 하나씩 거슬러 올라가면서 최종 값이 더해져 계산됩니다.
✅ 정리해서 한 줄로 말하면!
- oz_fibo(9)처럼 큰 숫자를 넣으면, 함수는 계속 n-1, n-2로 거슬러 내려가며 계산합니다.
- 그러다가 **n == 1이나 n == 2**에서 1이라는 값으로 반환되고, 그 값들이 다시 차곡차곡 더해지면서 최종 값이 계산됩니다.
🚀 피보나치 수열의 재귀적 계산 과정이 이제 명확하게 이해되셨나요? 더 궁금한 부분이 있으면 편하게 물어봐 주세요! 😊
'Python' 카테고리의 다른 글
[[OZ코딩스쿨] 초격차 캠프 - 10일차 (함수) Chapter 6-10. 람다 (0) | 2025.03.13 |
---|---|
[[OZ코딩스쿨] 초격차 캠프 - 10일차 (함수) Chapter 6-9. 튜플 (0) | 2025.03.13 |
[[OZ코딩스쿨] 초격차 캠프 - 10일차 (함수) Chapter 6-7. 재귀 함수 (0) | 2025.03.13 |
[[OZ코딩스쿨] 초격차 캠프 - 10일차 (함수) Chapter 6-6. 함수의 기본활용 (0) | 2025.03.13 |
[[OZ코딩스쿨] 초격차 캠프 - 10일차 (함수) Chapter 6-5. 함수 리턴 (0) | 2025.03.13 |