재귀 호출 분석
규칙
검증
def factorial(num):
if num > 1:
return num * factorial(num - 1)
else:
return num
재귀호출의 시간 복잡도
재귀호출의 전형적인 예
회문(순서를 거꾸로 읽어도 제대로 읽은 것과 같은 단어와 문장을 의미)을 판별하는 함수를 리스트 슬라이싱을 활용하여 만들어보자
def palindrome(string):
if len(string) <= 1:
return True
if string[0] == string[-1]:
return palindrome(string[1:-1])
else:
return False
동적 계획법(Dynamic Programming)
동적 계획법 알고리즘
함수를 '피보나치'라고 한다면
fibonacci(0): 0
fibonacci(1): 1
fibonacci(2): 1
fibonacci(3): 2
fibonacci(4): 3
fibonacci(5): 5
fibonacci(6): 8
재귀호출 사용
def fibonacci(num):
if num <= 1:
return num
return fibonacci(num-1) + fibonacci(num-2)
동적 계획법 사용
def fibonacci(num):
cache = [0 for index in range(num+1)]
print(cache) # [0, 0, 0, 0, 0, 0, 0]
cache[0] = 0
cache[1] = 1
for index in range(2, num+1):
cache[index] = cache[index-1] + cache[index-2]
return cache[num]
tile = [0 for index in range(1001)]
tile[1] = 1
tile[2] = 2
n = int(input())
for index in range(3, 1001):
tile[index] = tile[index-1] + tile[index-2]
print(tile[n] % 10007)
퀵 정렬 알고리즘 구현
def quicksort(data):
if len(data) <= 1:
return data
pivot = data[0]
left, right = list(), list()
for index in range(1, len(data)):
if pivot > data[index]:
left.append(data[index])
else:
right.append(data[index])
return quicksort(left) + [pivot] + quicksort(right)
data_list = [11, 85, 45, 50, 33, 68, 14]
quicksort(data_list) # [11, 14, 33, 45, 50, 68, 85]
퀵 정렬 알고리즘을 list comprehension을 사용하여 더 좋은 알고리즘으로 작성해보기
def quicksort(data):
if len(data) <= 1:
return data
pivot = data[0]
left, right = list(), list()
left = [item for item in data[1:] if pivot > item]
right = [item for item in data[1:] if pivot <= item]
return quicksort(left) + [pivot] + quicksort(right)