파이썬 튜토리얼-재귀 함수
이 섹션에서는 파이썬 재귀 함수에 대해 배웁니다.
파이썬 재귀 함수는 무엇입니까
재귀 함수는 자신을 호출하는 함수이며이 프로세스를 함수 재귀라고합니다.
예를 들어 숫자의 계승 (예 :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))
재귀의 장점
- 재귀 기능을 사용하면 문제를 쉽게 해결할 수있는 하위 문제로 나눌 수 있습니다.
- 코드가 깔끔하고 깨끗해집니다.
재귀의 단점
- 때로는 재귀 함수의 논리를 따르는 것이 어렵습니다.
- 각 하위 문제를 해결하는 데 많은 시간이 걸리므로 재귀 함수는 비효율적입니다.
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