-
파이썬 데코레이터 재귀 함수컴퓨터/파이썬 2020. 10. 30. 14:42728x90반응형
Decorating recursive functions
사용할 데코레이터는 정렬 알고리즘이 정렬을 잘 했는지 체크한다.
def isSorted(func): def wrapper(array, *args): lib = bigO() result = func(array, *args) _sorted, index = lib.isAscendingSorted(result) if index == 1: msg = f"{result[index - 1]}, {result[index]}..." elif index == len(result) - 1: msg = f"...{result[index - 1]}, {result[index]}" elif isinstance(index, int): msg = f"...{result[index - 1]}, {result[index]}, {result[index + 1]}..." if not _sorted: # Just see the result if it doesn't sort correctly print(f"{func.__name__} doesn't sort correctly.\nAt {index} index: [{msg}]") else: print(f"{func.__name__} sorts correctly.") return wrapper
아래 거품 정렬같은 재귀 없는 함수에서는 잘 작동하지만
@isSorted def bubbleSort(array): isSorted = False count = 0 while not isSorted: isSorted = True for i in range(len(array) - 1 - count): if array[i] > array[i + 1]: array[i], array[i + 1] = array[i + 1], array[i] isSorted = False count += 1 return array # 출력: bubbleSort sorts correctly.
재귀 함수를 사용한 빠른 정렬에서는 함수를 부른만큼 데코레이터가 작동했다.
@isSorted def quickSort(array, lo=0, hi=None): if hi is None: hi = len(array) - 1 while hi > lo: p = partition(array, lo, hi) quickSort(array, lo, p) lo = p + 1 return array ''' 결과 At 998 index: [...998, 990, 1000...] quickSort doesn't sort correctly. At 998 index: [...998, 990, 1000...] quickSort sorts correctly. quickSort sorts correctly. quickSort sorts correctly. quickSort sorts correctly. quickSort sorts correctly. '''
해결 방법
데코레이터를 제거하고, 데코레이터로 직접 함수를 불러야한다.
def quickSort(array, lo=0, hi=None): if hi is None: hi = len(array) - 1 while hi > lo: p = partition(array, lo, hi) quickSort(array, lo, p) lo = p + 1 return array if __name__ == "__main__": isSorted(quickSort)(lib.genRandomArray(1000))
728x90'컴퓨터 > 파이썬' 카테고리의 다른 글
파이썬 커스텀 range, iterator (0) 2020.10.30 딥러닝: Mish 활성화 함수, 모델 불러오기 (0) 2020.10.29 딥러닝 옵티마이저: Adabelief Optimizer (0) 2020.10.27