Python 装饰器 - 斐波那契递归函数 - 意外输出

Python Decorator - Fibonacci Recursive Function - Unexpected Output

我尝试在递归函数上使用装饰器,例如计算 nth 斐波那契数的函数。

下面是我写的代码:

class FibList:
# decorator will return a list of fibonacci numbers from 0 to n.
    def __init__(self, func):
        self.func = func

    def __call__(self, *args):
        return [self.func(x) for x in range(args[0])]

@FibList
def fibonacci(n):
    # function will return nth fibonacci number
    if n < 2:
        return n
    else:
        return fibonacci(n-2) + fibonacci(n-1)

if __name__ == "__main__":
    a = fibonacci(4)
    print(a)

a 的输出如下所示:[0, 1, [0], [0, 0, 1]]。但是,我希望输出看起来像这样:[0, 1, 1, 2]

我真的很难理解装饰后的 fibonacci 函数内部发生了什么。

如果有人能帮我澄清这种奇怪的行为,我将不胜感激。谢谢。

您的问题是由多重递归引起的。

如果您 运行 调试器并检查递归函数的每次调用,您会注意到 if-block returns 数字正确。这就是为什么结果列表中的前两个数字是正确的。 但是一旦到达else-block,它就会分别用n-2n-1调用Class的__call__方法,从而在里面创建一个新的子列表您的结果列表。

When `n==2` the result would become:
fibonacci(n-2) -> __call__(self, 0) --> []
fibonacci(n-1) -> __call__(self, 1) --> [0]
return fibonacci(n-2) + fibonacci(n-1) --> [] + [0] = [0]

对于 n==3 你会得到最后一个子列表 [0,0,1]

你需要想办法阻止这个 multi-recursive 调用。