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