如何在Python中不使用全局变量来跟踪递归调用的数量.例如,如何修改以下功能以跟踪呼叫次数?
def f(n):
if n == 1:
return 1
else:
return n * f(n-1)
print f(5)
Run Code Online (Sandbox Code Playgroud)
DSM*_*DSM 10
这是一个不使用全局的巧妙技巧:你可以在函数本身中存储计数器.
def f(n):
f.count += 1
if n == 1:
return 1
else:
return n * f(n-1)
Run Code Online (Sandbox Code Playgroud)
之后:
>>> f.count = 0 # initialize the counter
>>> f(5)
120
>>> f.count
5
>>> f(30)
265252859812191058636308480000000L
>>> f.count
35
Run Code Online (Sandbox Code Playgroud)
无论如何,它处理"所有通话"的情况.
作为delnan说,如果你想所有的呼叫曾经,它是没有一个全球不可能的,所以我假设你只是想通话的深度,而您只需要添加一个返回值
def f(n):
if n == 1:
return 1,0
else:
x, call_depth= f(n-1)
return n * x, call_depth+1
Run Code Online (Sandbox Code Playgroud)
如果你正在处理几个递归调用,你可以做一个max(call_depth1, call_depth2)(深度最长的调用树)或只是将两者相加(实际调用的总数)
此方法将为您提供函数运行的总次数:
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)
Run Code Online (Sandbox Code Playgroud)