在Python中不使用全局变量来跟踪递归调用的数量

sno*_*now 4 python recursion

如何在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)

无论如何,它处理"所有通话"的情况.

  • `f.count`是全局变量`f`(它是函数对象)的一个属性,因此以这种方式执行它不能完全清楚地满足不使用全局变量的要求. (2认同)

gon*_*opp 6

作为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)(深度最长的调用树)或只是将两者相加(实际调用的总数)


Mik*_*lla 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)
Run Code Online (Sandbox Code Playgroud)