检测递归调用

时间:2013-01-29 04:43:20

标签: ruby recursion

检测递归方法调用的最佳方法是什么?也许,它可以制成这种格式:

def foo
  if some_code_to_detect_recursive_call
    ...
  else
    ...
  end
end

我可以想出解析caller信息的方法,但我有兴趣看看是否有更好的方法。

2 个答案:

答案 0 :(得分:3)

只需在输入方法后递增计数器(实例或全局变量),然后在退出时递减计数器。

在输入时,计数器会告诉您递归级别。

答案 1 :(得分:1)

   A  B  C
0  a  c  x
1  a  c  x
2  a  d  z
3  b  d  y
4  b  d  y

测试用例:

def is_recursive(max_recursive_calls=2)
  calls = caller.inject(0) do |calls, line|
    break calls if calls >= max_recursive_calls
    calls += 1 if line == caller[-2]
    calls
  end
  calls >= max_recursive_calls
end

输出

# 1
def recursive
  p "case #1"
  recursive unless is_recursive
end

# 2
def recursive_a
  p "case #2.1"
  recursive_b unless is_recursive
end

def recursive_b
  p "case #2.2"
  recursive_a unless is_recursive
end

# 3
def recursive_cond(iter=0, limit=10)
  p "case #3"
  recursive_cond(iter + 1, limit) unless iter > limit || is_recursive(50)
end

recursive
recursive_a
recursive_b
recursive_cond

p "If you see this: is_recursive function implemented correctly"