使用python装饰器调用递归函数的次数

问题描述 投票:3回答:1

我有关于功能装饰器的以下代码块我想在第二次调用wrapper.calls时将变量fib()初始化为0知道在第一次运行时它给出了正确答案,之后,它表现为对先前输出求和。我的问题是如何通过更改装饰器分析器来解决这个问题,好吗?

这是我的代码:

from functools import wraps
import time


def profiler(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        wrapper.calls += 1
        return func(*args, **kwargs)
    wrapper.calls = 0
    return wrapper

@profiler
def fib(n):
    if n == 0:
        return 0
    if n == 1:
        return 1
    else:
        return fib(n-1) + fib(n-2)


fib(1)
print(fib.calls)
fib(2)
print(fib.calls)

执行后该程序的输出:

1
4

预期产出

1 
3
python-3.x python-decorators
1个回答
0
投票

因为calls = 0只在fib = profiler(fib)初始化。

如果你只执行

fib(2)
print(fib.calls)

它将是3

要么

for input_n in (1, 2):
    fib = profiler(fib)
    fib(input_n)
    print(fib.calls)

将是你期望的

1
3
© www.soinside.com 2019 - 2024. All rights reserved.