在Python中不使用全局变量追踪递归调用次数
如何在Python中跟踪递归调用的次数,而不使用全局变量。比如,怎么修改下面这个函数来记录调用的次数呢?
def f(n):
if n == 1:
return 1
else:
return n * f(n-1)
print f(5)
5 个回答
6
这个方法可以告诉你这个函数总共运行了多少次:
def f(n):
if hasattr(f,"count"):
f.count += 1
else:
f.count = 1
if n == 1:
return 1
else:
return n * f(n-1)
10
这里有个很不错的技巧,不需要用全局变量:你可以把计数器放在函数内部。
def f(n):
f.count += 1
if n == 1:
return 1
else:
return n * f(n-1)
接下来:
>>> f.count = 0 # initialize the counter
>>> f(5)
120
>>> f.count
5
>>> f(30)
265252859812191058636308480000000L
>>> f.count
35
这样做可以处理“所有调用”的情况。
7
正如delnan所说,如果你想要记录所有的调用记录,那是没办法做到的,因为这需要一个全局变量。所以我假设你只是想知道调用的“深度”,为此你只需要添加一个返回值。
def f(n):
if n == 1:
return 1,0
else:
x, call_depth= f(n-1)
return n * x, call_depth+1
如果你处理的是多个递归调用,你可以用 max(call_depth1, call_depth2)
来获取最长调用树的深度,或者直接把两个调用的深度相加(也就是实际调用的总数)。