亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何讓一個函數記住2個變量函數值?

如何讓一個函數記住2個變量函數值?

躍然一笑 2023-12-05 15:49:40
我想提高遞歸計算值的性能n = 100def T(n,k):    q = 0    if n == 0 and k == 0:        return(1)        q = 1    if k>n or n<0:        return(0)        q = 1    if q != 1:        return(T(n-1,k-1)+n*T(n-1,k))for i in range(n):    for n in range(i+1):        print(T(i,n))    print("*********")但是,我只找到了使用僅接受 1 個參數的函數來執行此操作的方法,如下所示:def mem(f):    memory = {}    def inner_function(x):        if x not in memory:                        memory[x] = f(x)            return memory[x]        else:            return memory[x]    return inner_function@memdef fibonacci(n):    if n == 1 or n == 0:        return 1    else:        return fibonacci(n-1) + fibonacci(n-2)我正在考慮做一個二維數組,但我還不知道(假設這是可能的)使用列表列表這樣做的想法會有什么幫助。
查看完整描述

2 回答

?
當年話下

TA貢獻1890條經驗 獲得超9個贊

你可以用functools.lru_cache這個

from functools import lru_cache


@lru_cache(maxsize=32)

def T(n,k):

? ? q = 0

? ? if n == 0 and k == 0:

? ? ? ? return(1)

? ? ? ? q = 1

? ? if k>n or n<0:

? ? ? ? return(0)

? ? ? ? q = 1

? ? if q != 1:

? ? ? ? return(T(n-1,k-1)+n*T(n-1,k))

您可以使用此裝飾器來記憶函數調用,特別是使用此函數,這將保存maxsize最近的調用。


請注意,在這種特殊情況下,由于您的陳述,絕大多數print時間實際上都花在了寫入控制臺上。如果您刪除它(但仍然保留您的T(i,n)調用),您的代碼將幾乎立即完成。


查看完整回答
反對 回復 2023-12-05
?
森欄

TA貢獻1810條經驗 獲得超5個贊

您可以輕松擴展mem裝飾器以使用可變*args參數,并在memory. 這也適用于**kwargs,但您必須將它們轉換為可哈希類型,frozenset例如tuples。當然,為此,所有參數都必須是可散列的。


def mem(f):

    memory = {}

    def inner_function(*args):

        if args not in memory:            

            memory[args] = f(*args)

        return memory[args]

    return inner_function

用你的T功能測試過,工作正常。然而,在實踐中,您可能仍然想使用functools.lru_cache.


查看完整回答
反對 回復 2023-12-05
  • 2 回答
  • 0 關注
  • 148 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號