파이썬에서 재귀 함수를 빌드하려면 어떻게 해야 하나요?
'재귀'를 의미하는 것인지 궁금합니다. 다음은 [계승 함수]를 계산하는 재귀 함수의 간단한 예입니다(http://en.wikipedia.org/wiki/Factorial):
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n - 1)
재귀 알고리즘의 두 가지 핵심 요소는 다음과 같습니다:
n == 0
인수(n - 1)
Python 에서 사용할 수 있는 것처럼 반복 반복 반복 chunghwa 측면에서 다른 언어로 정의할 수 있는 것이다.
예를 들어 재귀 클래스용 이진 트리 (또는 기타 진단트리는) 될 수 있습니다.
class tree():
def __init__(self):
'''Initialise the tree'''
self.Data = None
self.Count = 0
self.LeftSubtree = None
self.RightSubtree = None
def Insert(self, data):
'''Add an item of data to the tree'''
if self.Data == None:
self.Data = data
self.Count += 1
elif data < self.Data:
if self.LeftSubtree == None:
# tree is a recurive class definition
self.LeftSubtree = tree()
# Insert is a recursive function
self.LeftSubtree.Insert(data)
elif data == self.Data:
self.Count += 1
elif data > self.Data:
if self.RightSubtree == None:
self.RightSubtree = tree()
self.RightSubtree.Insert(data)
if __name__ == '__main__':
T = tree()
# The root node
T.Insert('b')
# Will be put into the left subtree
T.Insert('a')
# Will be put into the right subtree
T.Insert('c')
순환 구조를 가져야 종료하십시오 찼음을 이미 밝힌 바 있다. 이 때문에 새로운 요소가 추가될 경우 미디어만을 재귀 명백하네 클래스, 그렇지 않을 것이다, 단 한 번만 더 않습니다.
또한 눈여겨볼 만한 깊이를 제한이 있다, 파이썬 기본적으로 모든 computer& # 39 의 메모리를 사용할 수 있는 것을 막기 위해 반복이 예상된다. 이것은 내 컴퓨터에 대한 1000년. 내가 don& # 39 이 변경, t 다운로드되었는지 따라 하드웨어 등. 네 볼 수 있습니다.
import sys
sys.getrecursionlimit()
및 설정할 수 있습니다.
import sys #(if you haven't already)
sys.setrecursionlimit()
편집: # 39, t 구아렌테 can& 내가 내 가장 효율적인 이진 진단트리는 설계 되었습니다. 만약 누군가 이를 개선할 수 있는 방법을 듣고 행복하게 I& # 39; d
빌드를 하고 싶다고 가정해 봅시다: u(n+1)=f(u(n)), u(0)=u0
한 가지 해결책은 간단한 재귀 함수를 정의하는 것입니다:
u0 = ...
def f(x):
...
def u(n):
if n==0: return u0
return f(u(n-1))
안타깝게도 높은 값의 u를 계산하려는 경우 스택 오버플로 오류가 발생합니다.
또 다른 해결책은 간단한 루프입니다:
def u(n):
ux = u0
for i in xrange(n):
ux=f(ux)
return ux
하지만 n의 다른 값에 대해 여러 개의 u 값을 원한다면 이 방법은 차선책입니다. 배열에 모든 값을 캐시할 수 있지만 메모리 부족 오류가 발생할 수 있습니다. 대신 제너레이터를 사용하는 것이 좋습니다:
def u(n):
ux = u0
for i in xrange(n):
ux=f(ux)
yield ux
for val in u(1000):
print val
다른 많은 옵션이 있지만 이것이 주요 옵션이라고 생각합니다.
재귀 함수 예제:
def recursive(string, num):
print "#%s - %s" % (string, num)
recursive(string, num+1)
함께 실행하세요:
recursive("Hello world", 0)