파이썬 튜토리얼-재귀 함수

Jinku Hu 2023년1월30일
  1. 파이썬 재귀 함수는 무엇입니까
  2. 재귀의 한계
  3. 재귀의 장점
  4. 재귀의 단점
파이썬 튜토리얼-재귀 함수

이 섹션에서는 파이썬 재귀 함수에 대해 배웁니다.

파이썬 재귀 함수는 무엇입니까

재귀 함수는 자신을 호출하는 함수이며이 프로세스를 함수 재귀라고합니다.

예를 들어 숫자의 계승 (예 :6)을 계산해 봅시다.

6 * 5 * 4 * 3 * 2 * 1

다음 코드에서는 숫자의 계승을 찾는 재귀 함수가 작성됩니다.

def fact(n):
    """Recursive function to find factorial"""
    if n == 1:
        return 1
    else:
        return n * fact(n - 1)


a = 6
print("Factorial of", a, "=", fact(a))
Factorial of 6 = 720

fact(n)함수는 재귀 함수입니다. fact 함수는 숫자가 1이 될 때까지 인수 ’n-1’을 사용하여 자신을 호출합니다. 이것은 계승이 계산되는 방식입니다. 즉, 숫자에 1보다 작은 계승을 곱합니다.

이 재귀 함수에는 숫자가 1 이되고 1 이 리턴되고 재귀 호출이 유한하게되는 기본 조건이 있습니다.

재귀 함수를 만들 때 해당 재귀 호출을 끝내려면 기본 조건이 있어야합니다.

재귀의 한계

아시다시피, 함수가 자신을 호출 할 때마다 중간 값을 저장하기위한 메모리가 필요합니다. 따라서 재귀 함수는 일반적인 비 재귀 함수보다 훨씬 많은 메모리를 소비합니다. 파이썬은 재귀 호출 제한을 3000으로 설정합니다.

>>> import sys
>>> sys.getrecursionlimit()
3000

재귀가 3000을 초과하면 RecursionError가 발생합니다.

def fact(n):
    """Recursive function to find factorial"""
    if n == 1:
        return 1
    else:
        return n * fact(n - 1)


print(fact(4000))
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    print(factorial(4000))
  File "<pyshell#1>", line 5, in factorial
    return n * factorial(n-1)
  File "<pyshell#1>", line 5, in factorial
    return n * factorial(n-1)
  File "<pyshell#1>", line 5, in factorial
    return n * factorial(n-1)
  [Previous line repeated 989 more times]
  File "<pyshell#1>", line 2, in factorial
    if n == 1:
RecursionError: maximum recursion depth exceeded in comparison

재귀 제한을 제거하는 솔루션

재귀 제한을 필요한 재귀보다 큰 수로 설정하여 재귀 제한을 해결할 수 있습니다.

import sys

sys.setrecursionlimit(5000)


def fact(n):
    """Recursive function to find factorial"""
    if n == 1:
        return 1
    else:
        return n * fact(n - 1)


print(fact(4000))

재귀의 장점

  • 재귀 기능을 사용하면 문제를 쉽게 해결할 수있는 하위 문제로 나눌 수 있습니다.
  • 코드가 깔끔하고 깨끗해집니다.

재귀의 단점

  • 때로는 재귀 함수의 논리를 따르는 것이 어렵습니다.
  • 각 하위 문제를 해결하는 데 많은 시간이 걸리므로 재귀 함수는 비효율적입니다.
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook