Python 递归和打破(或忽略)循环
我有以下资料:Python 递归和打破(或忽略)循环,python,recursion,infinite-loop,Python,Recursion,Infinite Loop,我有以下资料: def rfunction(x, y): new_x = assignment1 new_y = assignment2 print "x depends on new_x of form y" rfunction(new_x, new_y) 我真正的代码要复杂得多,依赖于多个JSON等等。但这就是问题的要点。运行它将产生令人愉快的结果,直到我得到以下输出:x依赖于标签y的x,当然,运行到一个无限循环中。我怎样才能确保这只打印一次,然后中断(或忽
def rfunction(x, y):
new_x = assignment1
new_y = assignment2
print "x depends on new_x of form y"
rfunction(new_x, new_y)
我真正的代码要复杂得多,依赖于多个JSON等等。但这就是问题的要点。运行它将产生令人愉快的结果,直到我得到以下输出:
x依赖于标签y的x
,当然,运行到一个无限循环中。我怎样才能确保这只打印一次,然后中断(或忽略)递归,然后继续。我递归的结构是一个依赖图,其中弧只向下流向子节点,但节点可能有一个循环。正是这种循环的存在让我感到厌烦。如果你可能遇到的唯一循环是自引用(例如new\u x,new\u y
isx,y
),那么你可以通过一个简单的If
检查来解决这个问题:
def rfunction(x, y):
new_x = assignment1
new_y = assignment2
print "x depends on new_x of form y"
if new_x != x or new_y != y:
rfunction(new_x, new_y)
else:
do_something_else() # or maybe just return?
如果您需要关注更多的间接循环(例如,rfunction(1,1)
调用rfunction(1,2)
,再次调用rfunction(1,1)
),您需要跟踪以前看到的参数对。这里有一种使用集合
实现此目的的方法:
def rfunction(x, y, seen=None):
if seen is None:
seen = set()
seen.add((x, y))
new_x = assignment1
new_y = assignment2
print "x depends on new_x of form y"
if (new_x, new_y) not in seen:
rfunction(new_x, new_y, seen)
else:
do_something_else()
我注意到,这两个代码示例都没有基本情况(除了我正在打破的递归循环)。假设您的真实代码是这样的,所以我将让您在调整我的示例以适合您的代码时包含它。只要
在满足条件时返回,您就不会有无限循环;Python限制了递归深度,因此发布的代码最终会引发运行时错误:超过了最大递归深度
异常。因此类似于if x==new\u x:return rfunction(new\u x,new\u y)
?的内容将继续递归(如果没有其他rfunction()的话,递归将停止)
调用,并且x==new\u x
为false)。由于您的示例太模糊,无法具体说明,因此很难给出更具体的内容。