2014-02-21 1 views
0

이 쉽게 읽을 수 있기 때문에 나는 파이썬에서 설명하겠다 ....원래 함수에 많은 재귀 호출이있는 경우 루프가 반복되는 동안 재귀 함수를 사용하는 방법은 무엇입니까?

def loop(N,x,y): 
     if N < n:       #condition is defined elsewhere 
      side = 1.0/(2.0**(n+1)) 
      addTriangle(picture,x,y,side) 
      loop(N+1, x - .25*side, y - math.sqrt(.75)/2*side) 
      loop(N+1, x + .75*side, y - math.sqrt(.75)/2*side) 
      loop(N+1, x + .25*side, y + (side/4.0)*math.sqrt(3)) 
    loop(0, .25, math.sqrt(.75)/2) 

나는 재귀를 사용하지 않도록하기 위해이 함수를 다시 작성해야합니다. 그러나, 그것은 약간의 까다로운 만드는 분기 종류의 종류가 있습니다. 재귀를 사용하지 않도록 함수를 구성하려면 어떻게해야합니까? while/for 루프의 기본 구조를 제공 할 수 있다면 나머지를 이해할 수있을 것이라고 확신합니다. 감사.

답변

0

arguments 스택을 만들어 원하는 통화를 추적하지만 아직 만들지는 못했습니다. 일반적으로 loop으로 전화하는 대신 스택 위로 밀어 넣으십시오. arguments이 비어지면 되돌릴 수 있습니다.

def loop(N, x, y): 
    arguments = [(N, x, y)] 
    while arguments: 
     N, x, y = arguments.pop() 
     if N < n: 
      side = 1.0/(2.0**(n+1)) 
      addTriangle(picture,x,y,side) 
      arguments.append((N+1, x + .25*side, y + (side/4.0)*math.sqrt(3))) 
      arguments.append((N+1, x + .75*side, y - math.sqrt(.75)/2*side)) 
      arguments.append((N+1, x - .25*side, y - math.sqrt(.75)/2*side)) 

나는 원래의 재귀 적 방법으로 평가 된 순서를 유지하기 위해 마지막 세 문장의 순서를 바꾸었다. 추가 된 마지막 것이 가장 먼저 튀어 나올 것이기 때문에 이것은 필요합니다.

+0

감사합니다. "while arguments"조건을 분명히 할 수 있습니까? 언제 false를 반환해야합니까? – user3225639

+0

'while arguments '는 더 긴 형식 인'while len (arguments)! = 0'과 동일합니다. 파이썬에서, 빈리스트는 부울로 변환 될 때 False이고 비어 있지 않은리스트는 모두 참입니다. – Kevin

관련 문제