2012-01-21 4 views
1

나는 원칙적으로 재귀 함수를 반복 함수로 변환하는 것이 가능하다는 것을 읽었습니다. 나는 서로에게 전화하는 몇 가지 기능이 있습니다. 내 플로우 차트를 보면서 코드의 구조를 만들었고 재귀 스타일로 처리하는 것이 분명했습니다. 작은 크기의 문제에는 적합하지만 더 큰 규모에서는 세그먼트 오류가 발생합니다. 그래서 반복적 인 스타일로 전환하려고 노력하고 있습니다. 그러나 기술적으로는 분기 구조가 혼란 스럽기 때문에 그것을 할 수있는 방법을 상상할 수 없습니다. 누군가 그것을 처리 할 수있는 단서를 줄 수 있습니까?중첩 된 재귀 함수를 반복 함수로 변환

def main_function(parameters): 
    if condition0: 
     .... 
     if condition1: 
      .... 
      if condition2: 
       .... 
       return function1(parameters) 
      else: 
       .... 
       return function2(parameters) 
     else: 
      return function1(parameters) 
    else: 
     return function2(parameters) 
############################################# 
def function1(parameters): 
    if condition3: 
     ... 
     return function3(parameters) ### yet another function.. so messed up? :-(((
    else: 
     return main_function(parameters) 
############################################## 
def function2(parameters): 
    if condition4: 
     ... 
     return main_function(parameters) 
    else: 
     return function1(parameters) 
############################################### 
def function3(parameters): 
    if condition5 
     if condition6: 
     ... 
     return function3(parameters) 
     else: 
     ... 
     return main_function(parameters) 
    else: 
     return RESULTS # The only way out! 

어떤 생각이 크게 감사하겠습니다이 사전에 대단히 감사합니다 : 코드는 파이썬에서 그런 일입니다.

+1

나는 "모든 재귀 함수가 스택을 기반으로 하나 같이 쓸 수있다"로 생각하고 싶다. 그게 도움이되는지 모르겠다. – Oded

답변

1

표시 한 모든 return 문은 본질적으로 return some_other_function()이므로 state machine은이를 모델링하는 자연스러운 방법입니다. 각 함수에 해당하는 상태가 있고 return 문은 상태 전이가됩니다.

+0

답변을 주셔서 감사합니다, 나는 fsm에 대한 빠른 연구를 만들었지 만 전문 프로그래머가 아닙니다. –

0

모든 순환 호출은 return 문에서 시작됩니다. 이전 스택을 유지할 필요가 없습니다. 예를 들어, function1()return function3()이라면 function1 스택을 제거 할 수 있습니다. 이렇게하면 RuntimeError: maximum recursion depth exceeded을 얻지 못할 것입니다.

재귀 적으로 호출하는 대신 매개 변수를 사용하여 호출하도록 연속 함수를 반환하면이 작업을 수행 할 수 있습니다.

def main_function(parameters): 
if condition0: 
    if condition1: 
     if condition2: 
      return function1, parameters # return function to call next with arguments 
     else: 
      .... 
      return function2, parameters 
    else: 
     return function1, parameters 
else: 
    return function2, parameters 

다른 기능을 비슷한 방식으로 변경해야합니다. 다음과 같이 이제 main_function()를 호출 할 수

next_function, next_fun_param = main_function(parameters) 
while hasattr(next_function, '__call__') 
    next_function, next_fun_param = next_function(next_fun_param) 
# got the RESULT 
+0

괜찮아요. 작동 할 것 같습니다. ... 고맙습니다. –

관련 문제