[英]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 块正确地返回了数字。 这就是为什么结果列表中的前两个数字是正确的。 但是一旦它到达 else 块,它将分别调用具有n-2
和n-1
的类的__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]
您需要找到一种方法来防止这种多递归调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.