递归和突破(或忽略)一个循环

时间:2016-09-01 19:59:57

标签: python recursion infinite-loop

我有以下内容:

gem install rails-api
rails-api new my_app

我的真实代码要复杂得多,依赖于多个jsons等,但这是问题的要点。运行它将产生令人愉快的结果,直到我得到以下输出:def rfunction(x, y): new_x = assignment1 new_y = assignment2 print "x depends on new_x of form y" rfunction(new_x, new_y) ,当然会遇到无限循环。如何确保打印一次,然后打破(或忽略)递归,然后继续。我正在递归的结构是一个依赖图,其中弧只向下流向子节点,但节点可能有一个循环。正是这种循环的存在让我失望。

1 个答案:

答案 0 :(得分:2)

如果您可能遇到的唯一周期是自我引用(例如new_x, new_yx, 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)),您需要跟踪您所参考的参数对。以前见过。这是使用set

执行此操作的一种方法
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()

我注意到这些代码示例都没有基本情况(除了我打破的递归周期)。大概是你真正的代码所做的,所以当你调整我的例子以适合你的代码时,我会把它包括在内。