我有以下内容:
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)
,当然会遇到无限循环。如何确保打印一次,然后打破(或忽略)递归,然后继续。我正在递归的结构是一个依赖图,其中弧只向下流向子节点,但节点可能有一个循环。正是这种循环的存在让我失望。
答案 0 :(得分:2)
如果您可能遇到的唯一周期是自我引用(例如new_x, new_y
为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)
),您需要跟踪您所参考的参数对。以前见过。这是使用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()
我注意到这些代码示例都没有基本情况(除了我打破的递归周期)。大概是你真正的代码所做的,所以当你调整我的例子以适合你的代码时,我会把它包括在内。