我嘗試在遞回函式上使用裝飾器,例如計算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函式內部發生了什么。
如果有人可以幫助我澄清這種奇怪的行為,我將不勝感激。謝謝你。
uj5u.com熱心網友回復:
您的問題是由多次遞回引起的。
如果您運行除錯器并檢查遞回函式的每次呼叫,您會注意到 if 塊正確地回傳了數字。這就是為什么結果串列中的前兩個數字是正確的。但是一旦它到達 else 塊,它將分別呼叫__call__Class 的方法,n-2從而n-1在結果串列中創建一個新的子串列。
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]
您需要找到一種方法來防止這種多遞回呼叫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/482917.html
