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
is
x,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)。由于您的示例太模糊,无法具体说明,因此很难给出更具体的内容。