簡體   English   中英

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 塊正確地返回了數字。 這就是為什么結果列表中的前兩個數字是正確的。 但是一旦它到達 else 塊,它將分別調用具有n-2n-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM