在Python中不使用全局变量追踪递归调用次数

7 投票
5 回答
10978 浏览
提问于 2025-04-17 13:36

如何在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) 来获取最长调用树的深度,或者直接把两个调用的深度相加(也就是实际调用的总数)。

撰写回答