가장 까다로운 재귀 알고리즘에 대하여 공부하였다.
재귀 알고리즘 : 나 자신을 다시 호출하는 것을 재귀라고 한다.
팩토리얼
def factorial(num):
if num > 0:
return num * factorial(num - 1)
else:
return 1
def Euclidean(n1, n2)
r = n1 % n2
#나머지가 0이면 n2가 최대 공약수.
if n1 % n2 == 0:
return n2
return uclid(n2, r)
#원판 갯수, 현재 기둥, 최종 기둥, 중간기둥
def moveDist(discCnt, fromBar, toBar, viaBar):
if discCnt == 1:
print(f'{discCnt}disc : {fromBar}에서 {toBar}(으)로 이동!')
else:
moveDist(discCnt-1, fromBar, viaBar, toBar)
print(f'{discCnt}disc : {fromBar}에서 {toBar}(으)로 이동!')
moveDist(discCnt-1, viaBar, toBar, fromBar)
def mSort(ns, asc=True):
if len(ns) < 2:
return ns
#양쪽으로 분할해서 정렬.
midIndx = len(ns) // 2
leftNums = mSort(ns[0:midIndx], asc=asc)
rightNums = mSort(ns[midIndx:len(ns)], asc=asc)
# 분할한 리스트 정렬 후 병합.
mergeNums = []
leftIndx = 0; rightIndx = 0
while leftIndx < len(leftNums) and rightIndx < len(rightNums):
if asc:
if leftNums[leftIndx] < rightNums[rightIndx]:
mergeNums.append(leftNums[leftIndx])
leftIndx += 1
else:
mergeNums.append(rightNums[rightIndx])
rightIndx += 1
else:
if leftNums[leftIndx] > rightNums[rightIndx]:
mergeNums.append(leftNums[leftIndx])
leftIndx += 1
else:
mergeNums.append(rightNums[rightIndx])
rightIndx += 1
# 정렬하지 않은 나머지를 끝에 붙여둔다.
if leftIndx < len(leftNums):
mergeNums = mergeNums + leftNums[leftIndx:]
else:
mergeNums = mergeNums + rightNums[rightIndx:]
return mergeNums
def qSort(ns):
if len(ns) < 2:
return ns
else:
#기준값을 정하고 작고 크고 같은 값들을 따로 정한다.
midIndx = len(ns)//2
mid = []
left = []
right = []
for n1 in ns:
if n1 < ns[midIndx]:
left.append(n1)
elif n1 == ns[midIndx]:
mid.append(n1)
else:
right.append(n1)
# 각 부분을 다시 퀵정렬 후 병합한다.
left = qSort(left)
right = qSort(right)
merge = left + mid + right
return merge