簡體   English   中英

為什么這個python函數中的一行必要? (memoized遞歸)

[英]Why is a line in this python function necessary? (memoized recursion)

我從Peter Norvig的網站上獲得了以下代碼片段; 它是一個裝飾器,用於在函數調用上啟用memoization(緩存對函數的先前調用,以將指數遞歸更改為簡單的動態程序)。

def memo(f):
    table = {}
    def fmemo(*args):
        if args not in table:
            table[args] = f(*args)
        return table[args]
    fmemo.memo = table
    return fmemo

代碼工作正常,但我想知道為什么倒數第二行是必要的。 這顯然是我對Python知識的一個空白,但刪除線和運行簡單的fibonacci函數,它似乎仍然有效。 這是否與同時記憶多個功能有關? 為什么fmemo的成員變量被稱為備忘錄(假設它不是一個尷尬的巧合)?

謝謝!

由於函數就像其他任何東西一樣,您可以在它們上設置屬性。 看到:

>>> def foo(): pass
>>> foo.x = 1
>>> foo.x
1

第二行設置值的內部緩存作為函數對象的屬性,從而暴露它。 這意味着您可以使用記憶功能並隨意調整其緩存,而無需調用它。 這可能很方便。


例:

>>> @memo
... def id(x): return x
>>> id(1)
1
>>> id(2)
2
>>> id.memo
{(2,): 2, (1,): 1}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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