2016-09-01 2 views
2

을 탈출 할 (또는 무시) :재귀와 나는 다음과 같은 한주기

def rfunction(x, y): 
    new_x = assignment1 
    new_y = assignment2 
    print "x depends on new_x of form y" 
    rfunction(new_x, new_y) 

내 실제 코드는 훨씬 더 복잡하다 등 여러 jsons에 의존하지만,이 문제의 요점이다 . 이것을 실행하면 다음 결과를 얻을 때까지 유쾌한 결과를 얻을 수 있습니다 : x depends on x of label y, 물론 무한 루프가 발생합니다. 이 인쇄물을 한 번 인쇄 한 다음 재귀를 중단 (또는 무시)하고 계속 진행하려면 어떻게합니까? 재귀의 구조는 호가 자식을 향해 아래쪽으로 만 흐르는 종속성 그래프이지만 노드에는 루프가있을 수 있습니다. 저를 던지고있는 루프의 존재입니다.

def rfunction(x, y): 
    new_x = assignment1 
    new_y = assignment2 
    print "x depends on new_x of form y" 
    if new_x != x or new_y != y: 
     rfunction(new_x, new_y) 
    else: 
     do_something_else() # or maybe just return? 

을 당신이 더 많은 간접 사이클에 대해 우려해야하는 경우 발생할 수있는 유일한 사이클 경우

+0

조건이 충족되면 '돌아 가기'만 하시겠습니까? –

+1

당신은 무한 루프를 가질 수 없습니다. 파이썬은 재귀 깊이를 제한하기 때문에 게시 된 코드는'RuntimeError : maximum recursion depth exceeded' 예외를 발생시킬 것입니다. –

+0

그래서'x == new_x : return rfunction (new_x, new_y)'와 같은 것? – boldbrandywine

답변

2

자기 참조 (예 : new_x, new_yx, y이다), 당신은 간단한 if 검사와 함께이 문제를 해결할 수 있습니다 (예 : rfunction(1, 1)rfunction(1, 2)으로 다시 전화하며 rfunction(1, 1)을 다시 호출합니다.) 이전에 본 매개 변수 쌍을 추적해야합니다. 이 코드 예제도가 (내가 파괴하고있어 순환주기 이외의) 기본 케이스를 가지고

def rfunction(x, y, seen=None): 
    if seen is None: 
     seen = set() 
    seen.add((x, y)) 
    new_x = assignment1 
    new_y = assignment2 
    print "x depends on new_x of form y" 
    if (new_x, new_y) not in seen: 
     rfunction(new_x, new_y, seen) 
    else: 
     do_something_else() 

나는주의 것 : 여기 set 로모그래퍼 것을 할 수있는 하나의 방법이다. 아마도 실제 코드가 그렇듯이 코드에 맞게 예제를 적용 할 때 코드를 포함시켜야합니다.