将一堆嵌套递归函数转换为迭代函数

时间:2012-01-21 19:47:54

标签: recursion iteration

我已经读过,原则上可以将递归函数转换为迭代函数。我有一些函数互相调用。我构建了代码结构,查看了我的流程图,通过递归样式来表达它是显而易见的。它适用于小尺寸问题,但会出现更大规模的分段错误。所以我试图切换到迭代风格,但我无法想象一种技术上的方法,因为分支结构让我感到困惑。有人能给我一个处理它的线索吗?代码就像在python中那样:

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! 

非常感谢任何想法,非常感谢您提前。

2 个答案:

答案 0 :(得分:1)

由于您展示的每个return语句基本上都是return some_other_function(),因此state machine似乎是对此进行建模的自然方式。将存在与每个函数对应的状态,return语句将成为状态转换。

答案 1 :(得分: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