【问题标题】:Converting a bunch of nested recursive functions to iterative funcs将一堆嵌套递归函数转换为迭代函数
【发布时间】:2012-01-21 19:47:54
【问题描述】:

我读过,原则上可以将递归函数转换为迭代函数。我有一些相互调用的函数。我通过查看流程图构建了代码结构,很明显可以通过递归样式来完成。它对于小尺寸问题运行良好,但对于更大规模的问题会产生分段错误。所以我试图切换到迭代风格,但我无法想象一种技术上的方法,因为分支结构让我感到困惑。有人可以给我一个线索来处理它吗?代码类似于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! 

任何想法将不胜感激,非常感谢您。

【问题讨论】:

  • 我喜欢把它想象成“每个递归函数都可以写成一个基于堆栈的函数”。不知道这是否有帮助。

标签: recursion iteration


【解决方案1】:

由于您展示的每个return 语句本质上都是return some_other_function(),因此state machine 似乎是对其建模的一种自然方式。每个函数都会有一个状态对应,return 语句会变成状态转换。

【讨论】:

  • 感谢您的回答,我对 fsm 进行了快速研究,但我不是专业程序员,是否可以使用 like if's and while's 或类似的“简单”东西来做到这一点??跨度>
【解决方案2】:

因为每个递归调用都是在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

【讨论】:

  • 好的,看来它可以工作了......非常感谢
猜你喜欢
  • 2020-08-08
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多