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-2
和n-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 调用。
我尝试在递归函数上使用装饰器,例如计算 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-2
和n-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 调用。