본문 바로가기
Algorithm/자료구조와 함께 배우는 알고리즘(Python)

재귀 알고리즘의 기본, 재귀 알고리즘 분석

by k-mozzi 2021. 10. 25.
반응형
Preface

 

이번 장에선 재귀 알고리즘에 대해 공부했다.

 

재귀 알고리즘을 사용하면 코드를 보다 짧게 작성할 수 있다고 하는데, 나는 아직 재귀 알고리즘이 어떻게 작동하는 것인지 정확히 이해하지 못했다.

 

책에 수록되어 있는 그림을 보며 코드를 이해하려 해봐도 출력값을 예상할 수 없었다.

 

다음 장을 공부하기 전 모든 코드를 다시 한 번 살펴보며 완벽히 이해한 후 넘어갈 계획이다.


 

1. 재귀 알고리즘의 기본

 

 

- 재귀 : 어떠한 이벤트에서 자기 자신을 포함하고 다시 자기 자신을 사용하여 정의되는 경우

→ 프로그램을 간결하고 효율성 좋게 작성할 수 있음

 

 

- 팩토리얼 코드

def factorial(n: int) -> int:
    if n > 0:
        return n * factorial(n - 1)
    else:
        return 1


if __name__ == '__main__':
    n = int(input('출력할 팩토리얼값을 입력하세요.: '))
    print(f'{n}의 팩토리얼은 {factorial(n)}입니다.')

→ math 모듈에서 factorial( ) 함수를 제공

 

 

- 직접 재귀 : 자신과 똑같은 함수를 호출하는 방식

 

 

- 간접 재귀 : a( ) 함수가 b( ) 함수를 호출하고 다시 b( ) 함수가 a( ) 함수를 호출하는 구조

→ 다른 함수를 통해 자신과 똑같은 함수를 호출

 

 

- 유클리드 호제법 코드

def gcd(x: int, y: int) -> int:
    if y == 0:
        return x
    else:
        return gcd(y, x % y)


if __name__ == '__main__':
    print('두 정숫값의 최대 공약수를 구합니다.')
    x = int(input('첫 번째 정숫값을 입력하세요.: '))
    y = int(input('두 번째 정숫값을 입력하세요.: '))

    print(f'두 정숫값의 최대 공약수는 {gcd(x, y)}입니다.')

→ math 모듈에서 gcd( ) 함수를 제공

 


 

2. 재귀 알고리즘 분석

 

 

- 재귀 함수 코드

def recur(n: int) -> int:
    if n > 0:
        recur(n - 1)
        print(n)
        recur(n - 2)


x = int(input('정숫값을 입력하세요.: '))

recur(x)

 

 

- 순수한 재귀 : 재귀 호출을 여러 번 실행하는 함수

 

 

- 분석 방법

1. 하향식 분석 : 가장 위쪽에 위치한 상자의 함수 호출부터 시작하여 계단식으로 자세히 조사해 나가는 분석 방법

2. 아래쪽부터 쌓아 올리며 분석하는 방법

 

 

- 비재귀적으로 재귀 함수 구현

def recur(n: int) -> int:
    while n > 0:
        recur(n - 1)
        print(n)
        n = n - 2


x = int(input('정숫값을 입력하세요.: '))

recur(x)

 

 

- 스택으로 재귀 함수 구현

from stack import Stack


def recur(n: int) -> int:
    s = Stack(n)

    while True:
        if n > 0:
            s.push(n)
            n = n - 1
            continue
        if not s.is_empty():
            n = s.pop()
            print(n)
            n = n - 2
            continue
        break


x = int(input('정숫값을 입력하세요.: '))

recur(x)

 

728x90
반응형

'Algorithm > 자료구조와 함께 배우는 알고리즘(Python)' 카테고리의 다른 글

정렬 알고리즘, 버블 정렬  (0) 2022.01.02
하노이의 탑, 8퀸 문제  (0) 2021.12.29
큐란?  (3) 2021.10.24
스택이란?  (0) 2021.10.14
해시법  (0) 2021.10.12

댓글