Python 50 - 재귀 호출 / 스택(stack) / 유클리드 호제법
2021. 6. 11. 14:18ㆍpython
반응형
재귀 호출
1. 자기 자신을 다시 호출하는 기능
2. 함수 안에서 자신의 함수를 호출하는 기능
3. 반복문 + stack 구조 (뒤로가기, undo, ctrl+z)
def sum(n):
if n == 0:
return 0
return sum(n-1)+n # sum(n-1)에 대한 값은 모르니까 stack에 쌓아놓는다.
print(sum(5))
출력값 : 15
돌아가는 방식(stack이 쌓이는 모습)
print(sum(1)) -----> 1 1이 아래로 넘어감
print(sum(2)) -----> 1 + 2
3이 아래로 넘어감
print(sum(3)) -----> 3 + 3
6이 아래로 넘어감
print(sum(4)) -----> 6 + 4
10이 아래로 넘어감
print(sum(5)) -----> 10 + 5
print(sum(10)) ------> 55 출력
stack
한쪽 끝에서만 자료를 넣거나 뺄수있는 구조
바닥부터 데이터를 차곡차곡 쌓는 구조
LIFO(Last In First Out) : 후입선출, 마지막으로 들어온 데이터가 제일 먼저 나간다.
FILO(First In Last Out) : 선입후출, 처음에 들어온 데이터가 제일 마지막에 나간다.
stack 구조 용어
push : 마지막 데이터 위치에 데이터를 입력한다.
pop : 마지막 데이터 위치에 데이터를 꺼내는 작업(삭제)
top : 제일 최근에 들어간 데이터 즉 가장 위에 있는 데이터의 위치
push 함수 만들기 :
stack = []
def push(n) :
global stack
stack.append(n)
push(1)
push(2)
push(3)
print(stack) 출력값 : [1,2,3]
pop 함수 만들기 :
def pop() :
global stack
if len(stack) == 0:
return None
return stack.pop()
pop()
print(stack) 출력값 : [1, 2]
재귀 호출을 사용한 유클리드 호제법
유클리드 호제법
2개의 자연수로 최대공약수를 구하는 알고리즘
호제법 : 두 수가 상대방 수를 나누어 우너하는 수를 얻는 알고리즘
최대 공약수 구하기 (유클리드 호제법 X)
def gcd(x,y):
# x, y의 약수 구하기
a = []
b = []
for i in range(1, int(x/2)+1):
if x % i == 0:
a.append(i)
a.append(x) # a = x의 약수들
for i in range(1, int(y/2)+1):
if y % i == 0:
b.append(i)
b.append(y) # b = y의 약수들
# a, b의 교집합 구하기
c = []
for i in a:
if i in b:
c.append(i)
# c의 max값 구하기
c.sort()
return c[-1]
print(gcd(100,50)) 출력값 : 50
최대 공약수 구하기 (유클리드 호제법 O)
def gcd(x,y):
if x < y :
x,y = y,x # x와 y 스위칭
elif x > y :
while y != 0:
x = y
y = x%y
else :
return x
return x
print(gcd(100,50)) 출력값 : 50
최대 공약수 구하기 (유클리드 호제법 O + 재귀 호출)
def gcd(x,y):
if y == 0:
return x
return gcd(y, x%y)
print(gcd(100,50)) 출력값 : 50
*최대공약수 구하기 코드 비교*
유클리드 호제법 X | 유클리드 호제법 O | 유클리드 호제법 O + 재귀 호출 |
30줄의 코드가 6줄로 더욱 간소화된다.
작성자 : 엄코딩 eomcoding
파이썬 알고리즘 유클리드호제법 재귀호출 스택
python stack coding programming def codingtest
반응형
'python' 카테고리의 다른 글
Python 52 - 당장 좋은 것만 선택하는 그리디 ( 알고리즘 ) (0) | 2021.06.13 |
---|---|
Python 51 - 시간복잡도, 공간복잡도, 빅오표기법 ( 알고리즘 공부 ) (0) | 2021.06.12 |
Python 49 - 전역변수 지역변수 (0) | 2021.06.10 |
Python 48 - 조건문 제어문 _ for 반복문 (0) | 2021.06.09 |
Python 47 - 조건문 제어문 _ while문 (0) | 2021.06.08 |