[英]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.