일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
Tags
- codestates
- execution context
- 프로그래머스
- 운영체제
- 자료구조
- JavaScript
- 파이썬
- algorithm
- Computer Science
- OS
- react 기초
- typeScript
- node.js
- Operating System
- java
- REACT
- Zerobase
- 파이썬 알고리즘 인터뷰
- python algorithm
- 개발공부
- 글또
- 코드스테이츠
- 자바
- 알고리즘
- context switching
- 컴퓨터공학
- Python
- useState
- 자바스크립트
- 비동기
Archives
- Today
- Total
Back to the Basics
[Programmers-python algorithm] - 4강 본문
Computer Science/Algorithm & Data Structure
[Programmers-python algorithm] - 4강
9Jaeng 2021. 7. 3. 18:09728x90
PROGRAMMERS - PART4 RECURSIVE ALROTIGHM
Recursive algorithm - 기초
- 재귀 알고리즘은 알고리즘의 이름이 아니라 '성질' 이다
- 같은 알고리즘을 반복적으로 적용함으로써 풀어내는 방법 ex ) sum(n)=sum(n-1)+n
- 재귀알고리즘 에서는 종결조건이 중요하다. (Trivial case)
- 재귀함수(Recursive function)이란?
- 하나의 함수에서 자신을 다시 호출하여 작업을 수행하는 것.
- 생각보다 많은 종류의 문제가 재귀적으로 해결이 가능하다. (Recursively)
ex ) Binary Tree
Tree 탐색 : 10을 찾으시오 --> 재귀적인 방법으로 이용 가능함.
Recursive function을 호출할 때는 종결조건이 매우 중요하다!!
- 인자로 주어진 n이 특정 조건일 경우--어떠한 처리 , 아닐 경우 -- 재귀 처리
- 자연수의 합을 구하는 함수를 3 가지 방법으로 구현해 보고 세 가지 방법의 속도 차이를 비교해 보았다.
# Ex 1) 자연수의 합 구하기
# 1~n 까지의 자연수의 합을 구하시오
# s=1+sum(n-1)
## Solution 1 - recursive version
import time
k=2000
def summation(n):
if n <=1: ## Trivial case
return 1
else :
return n+summation(n-1) ## if thet isn't n<=1 condition, it'll go to - limt
st=time.time()
for i in range(k):
summation(i+1)
elapse1=time.time()-st
print(elapse1)
## 결과 : 0.5566554069519043
## -------------------------------------------------------
## Solution 2 - iterative version
def sum(n):
s=0
while n>=0:
s+=n
n-=1
return s
st2=time.time()
for i in range(k):
sum(i+1)
elapse2=time.time()-st2
print(elapse2)
## 결과 : 0.37777066230773926
## -------------------------------------------------------
## Solution 3 - Use mathematical formulars
def sum(n):
return n*(n+1)//2
st3=time.time()
for i in range(k):
sum(i+1)
elapse3=time.time()-st3
print("{0:f}".format(elapse3))
## 결과 : 0.001992
## -------------------------------------------------------
print('elapse 1 : {0:f} elapse 2 : {1:f} elapse 3: {2:f}'.format(elapse1,elapse2,elapse3))
결과 : elapse 1 : 0.556655 elapse 2 : 0.377771 elapse 3: 0.001992
Solution 1, 2 3 효률 비교
Solution 1 : Resulsively version
- 복잡도 O(n) n에 따라서 함수 호출이 증가하므로, n에 비례하는 복잡도를 갖는다.
- 함수를 다시 호출하고 return을 반복하므로 효율성 떨어짐
- 2000번 반복 시 elapse 1 : 0.556 sec 로 제일 오래걸림 Solution 2 : Iteratively version
- 복잡도 O(n) n에 비례하여 순환문 증가
- 하지만 Solution 1처럼 return을 반복하지는 않는다는 점에서 조금 더 효율적?
- 200번 반복 시 elapse 2 : 0.377 sec 로 Solution 1 보다 1.6배 빠름 Solution 3 : Mathmatical methode
- 복잡도 O(1)
- algorithm 이라기 보기 어렵지만, 복잡도 제일 낮음
- 2000번 반복 시 elapse 3 : 0.00199 로 제일 빠름
** Alrotighem 고려 시 복잡도도 중요하지만 효율성 측면도 유념해야 한다.
Practice 문제
- fibonacci 수열을 recursively version 과 Iteratively version으로 구현.
- 코드 구현은 아래의 링크를 통해 확인할 수 있다.
728x90
'Computer Science > Algorithm & Data Structure' 카테고리의 다른 글
[자료구조/알고리즘]재귀 - JSON - Serialize & Deserialize (0) | 2021.09.10 |
---|---|
[Algorithm] - 제곱근 , 소수점 구하기 (0) | 2021.08.31 |
[Programmers-python algorithm] - 5강 (0) | 2021.07.04 |
[Programmers-python algorithm] - 3강 (0) | 2021.07.03 |
[Programmers-python algorithm] - 1,2강 (0) | 2021.07.03 |
Comments