일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 공룡게임
- typeORM
- Nest.js
- Sequelize
- flask
- nestjs
- mongoose
- 자료구조
- MongoDB
- game
- cookie
- 정렬
- OCR
- AWS
- MySQL
- react
- class
- Bull
- Express
- GIT
- dfs
- 게임
- Queue
- JavaScript
- jest
- Dinosaur
- Python
- nodejs
- TypeScript
- Today
- Total
포시코딩
4월8일 - 재귀 vs 반복문 본문
문제
https://school.programmers.co.kr/learn/courses/30/lessons/132267
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이 1
def solution(a, b, n):
def fn(n, coke):
if n < a:
return coke
output = n//a*b
coke += output
return fn(output + n%a, coke)
return fn(n, 0)
다른 건 다 정답이고 테스트 12에서만 런타임 에러가 뜨는 걸 보니
시간초과인듯 한데
도무지 알 수 없어서 질문 탭에서 힌트를 참고한 결과,
파이썬에서는 'maximum recursion depth exceeded' 에러가 발생해 프로그램이 중단될 수 있다고 한다.
그래서 반복문으로 풀어봤다.
풀이 2
def solution(a, b, n):
coke = 0
while n >= a:
new = n // a * b
coke += new
empty = n % a
n = new + empty
return coke
깔끔하게 올 클리어
재귀 vs 반복문
문득, 재귀를 배우고 나서부턴 재귀를 쓸 수 있을 것 같은 상황이면
항상 재귀를 써왔던 것 같다.
재귀의 장단점도 모른채
그래서 한번 재귀와 반복문의 장단점을 비교해보았다.
재귀의 장단점은 다음과 같다.
장점
- 반복문보다 간결하게 표현할 수 있어서 가독성이 좋다.
- 특정 조건 만족 시 함수를 중단하고 이전 단계로 되돌아 갈 수 있다.
단점
- 반복문에 비해 함수 호출 비용이 높다.
- 코드가 실행될 때마다 호출 스택을 생성하고 제거하는 오버헤드가 발생한다.
- 함수 호출 스택을 사용하므로, 함수 호출의 깊이가 깊어지면 스택 오버플로우가 발생할 수 있다.
정리
정리하자면 재귀는 반복문보다 기능적으로 효율이 좋은게 없다고 볼 수 있다.
다만, 알고리즘에서 더욱 직관적으로 코드를 작성할 수 있다는 점에서
핵심 아이디어를 더욱 명확하게 표현할 수 있다는 게 큰 장점으로 작용한다.
키워드
오버헤드(overhead)
오버헤드란 어떤 작업을 수행하기 위해 추가로 필요한 부분을 말한다.
주로 프로그램 실행에 필요한 추가적인 시간, 메모리, CPU 자원 등을 의미하는데
이러한 오버헤드는 프로그램 실행의 효율성을 떨어뜨릴 수 있으며, 특히 실행 속도가 중요한 프로그램에서는 큰 문제가 될 수 있다.
재귀 함수의 경우, 함수 호출 스택을 사용하여 함수 호출 순서를 기억하므로,
함수 호출 비용이 반복문에 비해 크고, 코드가 실행될 때마다 호출 스택을 생성하고 제거하는 '오버헤드'가 발생한다.
이는 재귀 호출의 깊이가 깊어질수록 더 심해짐으로 호출 스택 오버플로우를 방지하기 위해
호출 깊이를 적절히 제한하거나, 재귀 호출 대신 반복문을 사용하여 구현하는 등의 방법을 고려해야 한다.
함수 호출 스택
함수 호출 스택(call stack)
함수 호출 스택(call stack)이란? 함수 호출 스택은 함수 호출과 관련된 정보를 저장하는 자료구조다. 각 함수 호출이 발생할 때마다 호출 스택에 호출된 함수의 정보가 저장되고, 해당 함수가 실행
4sii.tistory.com
'TIL' 카테고리의 다른 글
4월25일 - BFS, 파이썬 범위 만족시키기 & 계산 결과들 활용 (0) | 2023.04.25 |
---|---|
4월12일 - 함수의 범위 - 작성중 (0) | 2023.04.12 |
트랜잭션(Transaction)의 원자성(Atomicity), 일관성(Consistency), 고립성(Isolation), 지속성(Durability) (0) | 2023.04.06 |
4월6일 - Nest.js의 Request lifecycle (0) | 2023.04.06 |
4월5일 - RabbitMQ, Kafka (0) | 2023.04.05 |